C语言中关于二级指针的一道笔试题
如下代码
int main()
{
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
return 0;
}
我们在初学时可以画图理解 , 这非常有助于我们理解数据在内存中的一些问题
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;
这三行代码运行之后 , 就形成了如下图中的关系 :
printf("%s\n", **++cpp);
自加之后cpp已经指向了cp[1]
如图分析应该输出是POINT
printf("%s\n", *--*++cpp + 3);
cpp又一次自加之后已经指向了cp[2]
如图分析应该输出是ER
printf("%s\n", *cpp[-2] + 3);
如图分析应该输出是ST
printf("%s\n", cpp[-1][-1] + 1);
如图分析应该输出是EW
我们运行程序 , 结果与我们分析一致