深入理解指针!(画图思考能力)

题目如下:

根据编程思考所打印出答案

源代码如下:

#include <stdio.h>
int main()
{
    char* c[] = { "ENTER","NEW","POINT","FIRST" };
    char** cp[] = { c + 3,c + 2,c + 1,c };
    char*** cpp = cp;
    printf("%s\n", **++cpp);
    printf("%s\n", *-- * ++cpp + 3);
    printf("%s\n", *cpp[-2] + 3);
    printf("%s\n", cpp[-1][-1] + 1);
    return 0;
}

打印出来结果就为:

我们需要借助图形来帮助我们来更好理解这道题

如下图所示:

.

首先大体分析一下char *c,char**cp,char***cpp栈区位置依靠上图分析

char *c栈区中从上到下总共有四个栈区,依次被ENTER,NEW,POINT,FIRST所占据,依靠上图所示从上到下的指针分别为c,c+1,c+2,c+3。

char**cp栈区中从上到下总共有四个栈区’,依次被c+3,c+2,c+1,c所占据,在char**cp当中c+3,c+2,c+1,c都代表指针变量。

char***cpp=cp则只有一个栈区,被cpp所占据。

**++cpp分析

++cpp为cpp+1也就是cp+1,*++cpp就为cp中c+2中的值,也为c中c+2的地址,**++cpp则为POINT中P的值,随后打印P以及后面的值,遇到\0停止打印,则打印出来就是POINT。

*--*++cpp+3分析
因为上一个打印的代码导致cpp指针在cp中c+2的位置,则++cpp位置则在cpp中c+1的位置,*++cpp则为cpp中c+1位置的值,也就是c中c+1栈区的地址,--*++cpp则变为c中c未知的地址,指向ENTER中第一个E的的地址*--*++cpp则为ENTER中第一个E的值,+3就到了ENTER中第二个E的位置,随后打印出来的就是第二个E及其后面的值,遇到\0打印停止,也就是打印出来的是ER。

*cpp【-2】+3分析

因为上一个打印的代码导致cpp指针位置再次改变,指向cp当中c+1的位置,cpp【-2】=*cpp-2,则指向cp当中c+3的值也就是c栈区当中FIRST中F的地址,加一个*,为*cpp【-2】则为FIRST的值中F的值,+3后则为S的值,随后打印遇到\0打印停止,也就是打印出来ST。

cpp【-1】【-1】+1分析

因为上一个打印的代码不会影响cpp指针的位置则cpp指针还是在cp中c+2的位置,
例如:int a=10;
           int b=a+2;
           printf(“%d”,a);打印结果为10,方框【】中的运算与上面例子相似,不影响cpp指针的位置,只有像a++,a--的这种自增,自减的才会改变a的值。
cpp【-1】=*cpp-1,cpp【-1】【-1】=*((*cpp-1)-1),cpp-1指向cp栈区中c+3的位置,*cpp-1则为c+3中的值,也就是c栈区中POINT的地址,*(cpp-1)-1则为c栈区中NEW的地址cpp【-1】【-1】=*(*(cpp-1)-1),则为NEW中N的值,+1则为NEW中E的值,随后打印E及其后面的值,遇到\0停止,则打印出来的是EW。
习题小结:

该题需要深刻理解个指针的位置,并借助栈区图形来进行分析,这样显的简单明了,本题可锻炼我们的画图动脑能力,手脑兼备,方能一气呵成!各个打印分析都可画出变化过后的栈区图,如有兴趣,则可下去自行一一打印出来,这样更能方便理解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值