c-需要理解二维数组的输出



这是代码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])

还要记住,在所提供的代码中既没有二维数组。所有数组ccp都是一维指针数组。

最新更新