繁体   English   中英

C 指针:如何生成以下输出?

[英]C Pointers: How is the following output genrated?

#include <stdio.h>

char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;

int main()
{
    printf("%s \n", **++cpp);
    printf("%s \n", *--*++cpp+3);
    printf("%s \n", *cpp[-2]);      // line 3
    printf("%s \n", cpp[-1][-1]);   // line 4
    return 0;
}

输出:

TEST 
sQuiz 
QUIZ 
MCQ 

有人可以解释第 3 行和第 4 行的输出吗? 我理解前两个printf语句的输出,但第 3 行和第 4 行让我大吃一惊!

cpp在开始时指向cp 它在前 2 行中增加了两次,因此它在第 3 行指向cp + 2 (cp + 2)[-2]*(cp + 2 - 2) ,也就是*cp *cpc+3 ,它与另一个* "QUIZ"

cpp仍然指向第 4 行的cp + 2 ,索引-1将给出cp[1] ,即c+2 ,再次索引-1给出c[1] ,即"MCQ"

表达式中使用的数组指示符在极少数例外情况下被转换为指向它们的第一个元素的指针。

所以在这个声明中

char ***cpp = cp;

数组指示符cp被转换为指向由表达式c+3定义的第一个元素的指针。

在 printf 的调用中,指针cpp增加了两次。 本次通话中的第一次

printf("%s \n", **++cpp);

第二次在这次通话中

printf("%s \n", *--*++cpp+3);

因此,在 increment 之后的第一个调用指针 cpp 指向数组cp的第二个元素,即它指向像c+2一样初始化的元素。 因此,取消引用指针,我们得到指向输出的字符串文字"TEST"的指针。

在第二次调用中,指针cpp再次增加。 所以它指向由表达式c + 1定义的数组cp的元素。 取消引用这个指针*++cpp我们得到一个值为c + 1的指针。 递减值--*++cpp我们得到一个值为c的指针,该指针指向数组c的第一个元素。 取消引用指针,我们得到指向字符串文字"GeksQuiz"的第一个元素的指针。 现在将数字 4 添加到指针*--*++cpp+3我们得到一个指向字符串文字的第四个字符的指针。 所以在 printf 的这个调用中,输出是"sQuiz"

正如指出的那样,指针 cpp 现在在将其递增两次后指向数组 cp 的第三个元素。 因此,表达式cpp[-2]产生 attay cp的第一个元素,其值为c+3 所以在这个调用中输出了文字"QUIZ"

printf("%s \n", *cpp[-2]);      // line 3

此表达式cpp[-1]产生数组cp的第二个元素,其初始化方式类似于c+2 使用表达式cpp[-1][-1]我们得到一个指向数组 c 的第二个元素的指针,该元素指向在此调用中输出的字符串文字"MCQ"

printf("%s \n", cpp[-1][-1]);   // line 4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM