首页 > 试题广场 >

下面代码的执行结果是()

[单选题]
下面代码的执行结果是()
#include <stdio.h>
int main(void) {
    char *p[] = {"TENCENT", "CAMPUS", "RECRUITING"};
    char **pp[] = {p + 2, p + 1, p};
    char ***ppp = pp;
    printf("%s ", **++ppp);
    printf("%s", *++*++ppp);
    return 0;
}



  • CAMPUS RECRUITING
  • RECRUITING CAMPUS
  • CAMPUS CAMPUS
  • RECRUITING RECRUITING

从题干当中,我们可以画出这样的一个图,这样就比较直观的看出了p,pp,ppp都指向哪里了,关键是最后两个printf语句。
(1)printf(“%s”,**++ppp);即,ppp当前所指向的位置,再往下移一个位置,即pp的位置2,而pp的位置2指向的是p的位置2,p的位置2指向的是CAMPUS,所以先输出CAMPUS
(2)printf(“%s”,*++*++ppp);这个语句等价于 printf(“%s”,*++(*++ppp));所以我们首先看,++ppp,第一个printf语句中ppp已经指向了pp的位置2,所以再往下移一个,指向了pp的位置3,而(*++ppp)则代表pp位置3所指向的内容,即p的位置1(pp的位置3指向的是p的位置1),在此基础上前面再加上一个++,则代表指针p在位置1的基础上再往下移动,即指针p的位置2,而p的位置2所指向的内容是CAMPUS,所以第二行输出的也是CAMPUS。
所以正确答案是:CAMPUS CAMPUS

发表于 2018-03-03 15:42:43 回复(30)
请问一下能画个图解释一下吗?有点看不懂

发表于 2017-10-20 14:10:09 回复(0)
cccc
发表于 2017-04-23 14:46:07 回复(0)
记住第二条printf语句是在第一条的基础上的,此时ppp是执行一次++ppp后的值,就不会出错了,答案c没问题
发表于 2017-08-18 17:45:51 回复(4)
运算从右到左。 第一个prinf,ppp自增1地址指向p+1,p+1又指向中间字符串,通过双层取值即得到。 第二个printf,上个语句已经指向p+1,再次自增,地址指向p。取值得到地址p,再自增,即p+1,指向中间字符串。取值即得到。
发表于 2017-08-15 13:46:13 回复(2)
这种题看都不看,直接屏蔽……哪个同事要是这样编码,直接抄键盘……
发表于 2018-12-02 17:25:18 回复(1)
发表于 2022-11-29 18:11:19 回复(0)
++ppp是pp[1]的地址,取*是p[1]的地址,再取*是p[1]的值:CAMPUS,
记住这时ppp已经指到pp[1],下一条语句计算时,++ppp是pp[2]的地址,取*是p[0]的地址,再++是p[1]的地址,再取*是p[1]的值:campus
发表于 2018-03-18 09:41:20 回复(0)

从题干当中,我们可以画出这样的一个图,这样就比较直观的看出了p,pp,ppp都指向哪里了,关键是最后两个printf语句。
(1)printf(“%s”,**++ppp);即,ppp当前所指向的位置,再往下移一个位置,即pp的位置2,而pp的位置2指向的是p的位置2,p的位置2指向的是CAMPUS,所以先输出CAMPUS
(2)printf(“%s”,*++*++ppp);这个语句等价于 printf(“%s”,*++(*++ppp));所以我们首先看,++ppp,第一个printf语句中ppp已经指向了pp的位置2,所以再往下移一个,指向了pp的位置3,而(*++ppp)则代表pp位置3所指向的内容,即p的位置1(pp的位置3指向的是p的位置1),在此基础上前面再加上一个++,则代表指针p在位置1的基础上再往下移动,即指针p的位置2,而p的位置2所指向的内容是CAMPUS,所以第二行输出的也是CAMPUS。
所以正确答案是:CAMPUS CAMPUS
发表于 2022-06-29 16:19:10 回复(0)
这种题当然做项目时候根本不会通过,但是笔试就爱出,尤其是阿里和腾讯
发表于 2019-03-13 14:43:48 回复(0)
这种自增自减改变了变量的值
编辑于 2024-04-03 09:30:37 回复(0)
头一个输出已经改变了PPP指向的首地址,即第二个输出地址的计算从中间开始
发表于 2023-08-21 10:42:55 回复(0)
要注意第一次printf后,三级指针ppp的指向!哎。
发表于 2023-02-06 22:31:36 回复(0)
printf("%c ", 这里的计算是真实计算,其结果会延续到下面的代码中)
发表于 2022-10-22 16:40:26 回复(0)
二重指针都不常用,直接三重了
发表于 2021-04-10 22:28:35 回复(0)
1.++p操作后,p的指向已经改变
2.第二次++操作是在第一次的基础上进行
发表于 2020-06-27 08:05:16 回复(0)
没你们说的那么复杂吧。只需要注意,第一个输出之后ppp变了就行了。很容易选择c
发表于 2019-09-12 16:43:38 回复(0)
嘤嘤嘤,第一次++PPP之后就忘了PPP已经移动过一次了QAQ
发表于 2019-05-30 09:12:26 回复(0)
这道题,满天指针飞,猜对的,标记下
发表于 2019-05-05 21:24:38 回复(0)
点赞!忘了第一次输出后ppp的指针位置已经移动了一了。
发表于 2019-04-05 12:25:12 回复(0)