就是他
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;
}
结果是什么?
1.cpp是cp数组中第一个元素的地址,++cpp是cp中第二个元素的地址
*++cpp是cp中第二个元素的内容,是c中第3个元素的地址,在解引用得到"POINT"首元素地址,所以打印"POINT";
++cpp, cpp的值会发生变化,影响下面计算
2.开始时
++cpp后:
*++cpp得到cp第3个元素内容,即c第2个元素地址,-- * ++cpp得到c中第1个元素地址(cp中第二个元素内容发生改变)
*-- *++cpp得到c首元素内容,即"ENTER"首元素地址, *-- *++cpp + 3到"ENTER"第4个元素地址,所以打印"ER";
3. cpp[-2] == *(cpp + (-2)) == *(cpp - 2)
注意:与上面++cpp不同,这时cpp的值不会改变
所以cpp[-2]值为cp数组首元素内容,即c数组第4个元素的地址,在解引用得到"FIRST"的首元素地址,加3得到 ‘S’ 的地址,所以会打印"ST";
4.cpp[-1] == *(cpp - 1),所以cpp[-1]是cp第二个元素的内容,即c第3个元素的地址,cpp[-1][-1] == *(cpp[-1] - 1)将得到c第2个元素的内容('N’的地址),再+1得到’E’的地址,所以打印"EW"。