这是代码https://ide.geeksforgeeks.org/8bYOzDDC9U运行这个
#include <stdio.h>
char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;
int main()
{
cpp++;
printf("%s", cpp[0][0]); // TEST
printf("%s ", cpp[-1][-1]); // TEST
return 0;
}
两个printf((的输出都是TEST。为什么会这样?当我执行cpp++时,指针会移动到c+2。所以我知道cpp[0][0]将在"TEST"的开头,这就是它打印TEST的原因。有人能解释一下cpp[-1[-1]吗?
char ***cpp = cp;
初始化cpp
以指向cp
的第一个元素,即cp[0]
。
在cpp++
之后,cpp
指向cp[1]
。则cpp[-1]
指的是cp[0]
。
cp[0]
包含c+3
,CCD_11是指向c[3]
的指针。所以cp[0][-1]
是指c[2]
。
c[2]
包含"Test"
,因为它是指向"Test"
的第一个元素的指针,所以打印它会打印"Test"
。
指针cpp
最初指向数组cp
的第一个元素。
char ***cpp = cp;
在该声明之后
cpp++;
指针CCD_ 21指向阵列CCD_。所以这个表达式
cpp[-1]
给出阵列的第一个元素cp
注意表达式cpp[-1]
的计算方式类似
*( cpp - 1 )
因此事实上这两个陈述
cpp++;
和
cpp[-1]
如果在不递增指针CCD_ 27的情况下写入CCD_。
阵列的这个(第一个(元素CCD_ 28。包含值CCD_ 29,该值是指向数组c的最后一个元素的指针。
因此,cpp[-1][-1]
给出数组c
的最后一个元素之前的元素,该元素是指向字符串文字"TEST"
的第一个字符的指针。
因此字符串文字通过printf 的调用输出
printf("%s ", cpp[-1][-1])
还要记住,在所提供的代码中既没有二维数组。所有数组c
和cp
都是一维指针数组。