C语言指针笔试题

一道小有难度的指针笔试题

int main() {
	char* c[] = { "PEOPLE","MATH","HOUSE","COURSE"};
	char** cp[] = { c + 2,c + 3,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类型指针指向二级指针数组的首元素地址、
如下图所示:
在这里插入图片描述
第一个输出,我们++cpp改变了cpp的指向,第一次解引用拿到C+3的内容,第二次解引用拿到了COURSE空间的内容,%s打印,输出COURSE。
在这里插入图片描述
第二个输出:++CPP,改变CPP的指向,解引用一次,拿到C+1的内容,前置–改变了C+1的内容,称为C也改变了指向,第二次解引用指向了PEOPLE的首地址,+3前后移动3次,%s输出了PLE。
在这里插入图片描述
第三个输出*CPP【-2】+3相当于* *(CPP+2)-3,先将CPP向前移动两个位置,解引用拿到C+2的内容,再次解引用地址加3移动到S%s打印SE。
在这里插入图片描述
第四个输出CPP[-1][-2]+1相当于,*(*(CPP-1)-1),之前CPP+2指向C+2,同理,C-1指向C+3解引用拿到C+3的内容,C+3-2 为C+1即指向M,+1表示指针往后移动一位,%s输出ATH
在这里插入图片描述

本篇文章到此结束,如有不足之处,请评论指出!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值