需要了解二维数组的输出

Output of a 2-d array needs to be understood

这是代码 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] 解释一下吗?

最初指针cpp指向数组的第一个元素cp

char ***cpp = cp;

这条语句之后

cpp++;

指针cpp指向数组的第二个元素cp。所以这个表达式

cpp[-1]

给出数组的第一个元素cp

注意表达式cpp[-1]的计算方式类似于

*( cpp - 1 )

因此实际上这两个语句

cpp++;

cpp[-1]

可以被认为类似于 *( ( cpp += 1 ) - 1 ),如果写入 cpp[0] 而不增加指针 cpp,则具有相同的效果。

数组的这个(第一个)元素 cp。包含值 c+3,它是指向数组 c.

最后一个元素的指针

所以cpp[-1][-1]给出数组c最后一个元素之前的元素,它是指向字符串文字第一个字符的指针"TEST"

因此调用 printf 输出字符串文字

printf("%s ", cpp[-1][-1])

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

char ***cpp = cp;初始化cpp指向cp的第一个元素,即cp[0].

cpp++之后,cpp指向cp[1]。那么cpp[-1]就是指cp[0].

cp[0]包含c+3,是指向c[3]的指针。所以 cp[0][-1] 指的是 c[2].

c[2] 包含 "Test",因为它是指向 "Test" 的第一个元素的指针,因此打印它会打印 "Test".