快捷搜索: 王者荣耀 脱发

牛客网刷题笔记之指针题(超详细解答过程)

请写出下列程序的输出结果:
#include<stdio.h>

char *c[] = { "ENTER", "NEW", "POINT", "FIRST" }; 
char **cp[] = { c+3, c+2, c+1, c }; 
char ***cpp = cp; 

int main(void)
{ 
    printf("%s
", **++cpp);
    printf("%s
", *--*++cpp+3);
    printf("%s
", *cpp[-2]+3);
    printf("%s
", cpp[-1][-1]+1);
    return 0;
}
做这道题之前,我们先明确几个概念: 1、p++,p--,++p,--p会影响指针的指向。 例如: ++p相当于p = p + 1; 指针会保存改变后的指向。
2、p+2;这样表达式运算完后,指针指向不会受到影响,因为它并未保存改变后的指向。
3、数组与指针之间的转换: 例如: p[2] = *(p+2);p为数组首地址,p相当于&p[0],p+2相当于&(p+2),最左边加*,表示取值,即p[2]。 p[-1][-1] = *(*(p-1)-1);同理

分析: ① 对于 **++cpp来说,一开始cpp指向cp,即指向存放c+3的地址,

然后表达式先执行++cpp,指针后移,且保存指向,即指向存放c+2的地址,

之后*++cpp,解一层引用,指向地址中的内容c+2,即指向*c[]中存放第三个字符串的地址,

再执行**++cpp,即指向这个字符串的第一个的元素P,

然后输出,从P开始输出,遇到结束,即输出 POINT

② 对于*--*++cpp+3来说,现在cpp已经指向存放c+2的地址了,

先执行++cpp,即cpp指向存放c+1的地址,

然后执行*++cpp,即cpp指向*c[]中存放第二个字符串的地址,

再执行--*++cpp,即cpp指向*c[]中存放第一个字符串的地址,

再执行*--*++cpp,即cpp指向第一个字符串的第一个字符E,

再执行*--*++cpp+3,即cpp指向第一个字符串的第四个字符E,

再输出,结果为ER

③ 对于*cpp[-2]+3,目前cpp指向存放c+1的地址,

将表达式化简一下,即**(cpp-2)+3,

先执行cpp-2,cpp指向存放c+3的地址,

然后执行*(cpp-2),cpp指向*c[]中存放第四个字符串的地址,

再执行**(cpp-2),cpp指向第四个字符串的第一个字符F,

再执行**(cpp-2)+3,cpp指向第四个字符串的第四个字符S,

再输出,结果为ST

④ 对于cpp[-1][-1]+1,现在cpp还是指向存放c+1的地址,

将表达式化简一下,即*(*(cpp-1)-1)+1,

先执行cpp-1,cpp执行存放c+2的地址,

然后执行*(cpp-1),cpp指向*c[]中存放第三个字符串的地址,

再执行*(cpp-1)-1,cpp指向*c[]中存放第二个字符串的地址,

再执行*(*(cpp-1)-1),cpp指向第二个字符串的第一个字符N,

再执行*(*(cpp-1)-1)+1,cpp指向第二个字符串的第二个字符E,

输出,结果为EW

经验分享 程序员 微信小程序 职场和发展