一道指针笔试题

就是他

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

结果是什么?
在这里插入图片描述
1.cpp是cp数组中第一个元素的地址,++cpp是cp中第二个元素的地址
在这里插入图片描述
*++cpp是cp中第二个元素的内容,是c中第3个元素的地址,在解引用得到"POINT"首元素地址,所以打印"POINT";
++cpp, cpp的值会发生变化,影响下面计算

2.开始时在这里插入图片描述
++cpp后:
在这里插入图片描述
*++cpp得到cp第3个元素内容,即c第2个元素地址,-- * ++cpp得到c中第1个元素地址(cp中第二个元素内容发生改变
在这里插入图片描述
*-- *++cpp得到c首元素内容,即"ENTER"首元素地址, *-- *++cpp + 3到"ENTER"第4个元素地址,所以打印"ER";
3. cpp[-2] == *(cpp + (-2)) == *(cpp - 2)
注意:与上面++cpp不同,这时cpp的值不会改变
所以cpp[-2]值为cp数组首元素内容,即c数组第4个元素的地址,在解引用得到"FIRST"的首元素地址,加3得到 ‘S’ 的地址,所以会打印"ST";

4.cpp[-1] == *(cpp - 1),所以cpp[-1]是cp第二个元素的内容,即c第3个元素的地址,cpp[-1][-1] == *(cpp[-1] - 1)将得到c第2个元素的内容('N’的地址),再+1得到’E’的地址,所以打印"EW"。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值