![](/img/trans.png)
[英]Can you explain why will be output by executing the following C code such that :'d c c d'?(pointers)
[英]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
。 *cp
是c+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.