指针数组和数组指针的复杂应用分析

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

程序一:

 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

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

posted @ 2012-08-27 13:50  JackyBing  阅读(1411)  评论(5编辑  收藏  举报