C语言中关于二级指针的笔试题
int main(){
char* str[] = { "welcome","to","Fortemedia","Nanjing" };
char** p = str + 1;
str[0] = (*p++) + 2;
str[1] = *(p + 1);
str[2] = p[1] + 3;
str[3] = p[0] + (str[2] - str[1]);
printf("%s\n", str[0]);//\n
printf("%s\n", str[1]);//Nanjing
printf("%s\n", str[2]);//jing
printf("%s\n", str[3]);//g
return 0;
}
看到这段代码 ,我们不仔细思考, 很可能得出错误的结果 ,
比如得到
(空)
Nanjing
jing
temedia
不过 , 我们认真分析的话 , 得出正确答案也并不困难 .
char* str[] = { "welcome","to","Fortemedia","Nanjing" };
char** p = str + 1;
运行这两段代码后会得到如图所示 :
画出(*p++) + 2
str[0] = (*p++) + 2;
再将(*p++) + 2的值赋给str[0] , 此时str[0]指向就如下图 :
再画出*(p + 1)
str[1] = *(p + 1);
再将*(p + 1)的值赋给str[1] , 此时str[1]指向向就如下图 :
再画出p[1] + 3
str[2] = p[1] + 3;
然后再将p[1]+3的值赋给str[2] ,如下图:
再画出 p[0] + (str[2] - str[1])
str[3] = p[0] + (str[2] - str[1]);
我们可以得到str[2] -str[1] = 3 , 在两个指针指向同一片连续的存储空间时 , 是可以相减的 , 相减为两指针间差了几个元素 ,很明显差了三个 , 再将p[0]+str[2] -str[1]的值赋给str[3] ,如下图 :
所以依次输出str[0], str[1], str[2], str[3] 应该得到
(空)
Nanjing
jing
g
我们运行这段代码 ,得到下图