网上的一道指针面试题,分析程序输出结果!
程序一:
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:
代码行6:
代码行7:
代码行8:
代码行10:
程序运行结果:
程序二:
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:
代码行5:
代码行7:
代码行8:
代码行10:
程序运行结果:
以上即为两道程序的详细的分析过程和运行结果,相信看完本篇博文,各位读者应该对指针的理解又加深了些许吧!贴出自己的分析和思路,希望能够让大家对指针的深入理解有所帮助!
转载于:https://www.cnblogs.com/JackyTecblog/archive/2012/08/27/2658447.html
相关资源:数据结构—成绩单生成器