C/C++高阶指针指针、二维数组、指针数组相关练习

说明:接下来的例子,都会用画图的方法来解释

例1:


int main()
{
	const char* a[] = { "work", "at", "alibaba" };
	const char** pa = a;
	pa++;
	printf("%s\n", *pa);
	//打印的结果是" at ";
	//理由是,数组a是一个指针数组,二级指针指向数组a,那么pa直接指向的就是数组中的第一个指针
	//所以pa++指向的就是第二个指针,解引用得到的就是那个指针指向的数据:“at”
	return 0;

}

例题中,pa属于二级指针,其指向的内容可以是一级指针、也可以是指针数组。 

 例二:(这个例子比较复杂,需要有耐心)

在这里提前说明一下,c是一个指针数组,cp是一个二级指针数组,而cpp是一个三阶指针


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

	printf("%s\n",**++cpp);		//POINT
	printf("%s\n",*-- * ++cpp + 3);		//ER
	printf("%s\n",*cpp[-2] + 3);		//ST
	printf("%s\n",cpp[-1][-1] + 1);		//EW

	return 0;
}

解释如下列图像:

在第一个printf下,首先会对三级指针cpp进行++,而后会对其进行解引用。

注意:在cpp进行++后,cpp所指向的位置会发生改变!即下图所说明的

第二个printf下,保留了第一次cpp++造成的影响,如下解释:

这里的cpp-2,cpp的位置并不会因此而改变;就像你int a = 10, 然后printf("%d\n", a - 2);

在你进行调试的时候,a的值依然不会发生变化,只是借用了a的数值进行的运算而已;

同理如下

至此,所有的内容已经解释完毕了。

好好学习,就能变强!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值