比特鹏哥C-指针与数组的辨认与画图分析

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;
}

题目代码见上图;

代码分析:

画图:

执行第一个printf("%s\n", ** ++cpp);

此时 ++cpp 指向 c+2,在对++cpp整体解引用  得到 c+2 所指向的 c列 的第三个 char*  再次解引用 得到该char* 所指向的 POINT

执行第二个printf("%s\n", *-- * ++cpp + 3);

由第一步: 此时cpp已经指向 c+2  在继续进行第二个 : 先 ++cpp  使得cpp指向 c+1 解引用  指向c列第二个char*  再 -- 即指向 c列第一个char*  在解引用  指向 ENTER  的首元素E  然后+3  指向首元素后的第三个元素E  最后打印  ER

执行第三个printf("%s\n", *cpp[-2] + 3);

由第二部:此时cpp已经指向 c+1  再继续进行第三个:cpp[-2] <==> *(cpp - 2)  即cpp先指向 c+3 再解引用 指向 c列第四个char* 再解引用 指向FIRST 的F  再+3  从而指向S  打印出  ST

执行第四个printf("%s\n", cpp[-1][-1] + 1);

注意的是此时cpp还是指向c+1! 为什么呢因为上一步的 cpp-2 并没有改变cpp本身,就好比 int a = 10;  int b = a - 2;  b = 8; 但 a 任然为10;继续执行第四步:cpp[-1][-1] <==>   * ( * (cpp - 1) - 1)

从而指向 NEW 的 N 再+1 指向E 打印 EW

代码输出结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nefelibata_2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值