zoukankan      html  css  js  c++  java
  • 指针数组和数组指针的复杂应用分析

    网上的一道指针面试题,分析程序输出结果!

    程序一:

     1:  int main ( )
     2:      {
     3:          char *str[]={"welcome","to","fortemedia","Nanjing"};
     4:          char * * p=str+1;     //p存储 "to"字符串地址的地址,即&str[1]
     5:          
     6:          str[0]=(*p++) +2;      //str[0]指向'\0';  然后p后移一位,存储"fortemedia"字符串地址的地址, 即p=&str[2]
     7:          str[1]=*(p+1);            //p+1后 p+1 = &str[3];   则 str[1] = str[3] ,即现在str[1]和str[3]都指向了同一地址        
     8:          str[2]=p[1]+3;             //p[1]存储"Nanjing"字符串的地址,为(char *)型,加三的效果为:+sizeof(char)*3,     
     9:                                              //故str[2]存储了"Nanjing"字符串中的"jing"地址
    10:          str[3]=p[0]+(str[2]-str[1]);  //str[3]指向从p[0]开始(也就是*p,也就是str[2])的 偏移量为(str[2]-str[1])的地址~ str[2]指向"jing",str[1]指向str[3],    
    11:                                                      //也就是"Nanjing",所以str[3]指向"jing"的"g"地址
    12:          printf("%s\n",str[0]); //输出'\0',也即换行
    13:          printf("%s\n",str[1]); //输出"Nanjing"
    14:          printf("%s\n",str[2]); //输出"jing"
    15:          printf("%s\n",str[3]); //输出"g"
    16:          
    17:          return 0;
    18:      }

    以下是对上述代码关键行的图解注释:

    代码行4:

    image

    代码行6:

    image

    代码行7:

    image

    代码行8:

    image

    代码行10:

    image

    程序运行结果:

    image

    程序二:

     1:  int main()
     2:      {
     3:          char *str[] = {"welcome","to","fortemedia","Nanjing"}; 
     4:          char **p = str + 1; //p存储 "to"字符串地址的地址,即&str[1]
     5:          str[0] = *p++;         //首先p++,则此时p此时存储了str[2]的地址,但是后置操作符++的结果仍然是p加一之前的原值,故str[0]现在存储了
     6:                                          //"to"字符串的地址,也即相等于str[1]
     7:          str[1] = *(p+1);     //*(p+1)的结果为指向"Nanjing"字符串的地址,故str[1]现在存储了"Nanjing"字符串的地址,也即相等于str[3]
     8:          str[2] = p[1] + 3;     //p[1]的效果等效于*(p+1),即指向于"Nanjing"字符串的地址,然后*(p+1)+sizeof(char)*3,则此时str[2]存储
     9:                                          //"Nanjing"字符串中的子字符串"jing"的地址
    10:          str[3] = p[0] + (str[2] - str[1]); //由上述分析可知,str[2] - str[1]的结果为3,而p[0]与str[2]等效,故此时p[0]也存储了
    11:                                             //"Nanjing"字符串中的子字符串"jing"的地址,而p[0]+sizeof(char)*3的结果是str[3]存储了字符串"jing"中的
    12:                                             //子字符串"g"的地址
    13:  
    14:          printf("%s\n",str[0]);  //输出"to"
    15:          printf("%s\n",str[1]); //输出"Nanjing"
    16:          printf("%s\n",str[2]); //输出"jing"
    17:          printf("%s\n",str[3]); //输出"g"
    18:          return 0;
    19:      }

    以下是对上述代码关键行的图解注释:

    代码行4:

    image

    代码行5:

    image

    代码行7:

    image

    代码行8:

    image

    代码行10:

    image

    程序运行结果:

    image

    以上即为两道程序的详细的分析过程和运行结果,相信看完本篇博文,各位读者应该对指针的理解又加深了些许吧!贴出自己的分析和思路,希望能够让大家对指针的深入理解有所帮助!

  • 相关阅读:
    sqlite 一些常用的句子
    SnackBar使用
    semaphore demo 并行 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Expanded, SingleChildScrollView, CustomScrollView, container, height, width
    2个监听器+ dialog + replysubject + extends
    Transparent PageRoute in Flutter for displaying a (semi-) transparent page
    股票价格指数+加权
    Dojo
    iOS各版本图标尺寸汇总
    Xcode6 storyboard new push segue 后的视图控制器没有navigation item bug.
  • 原文地址:https://www.cnblogs.com/JackyTecblog/p/2658447.html
Copyright © 2011-2022 走看看