C++ 的指针的指针(如int **)和二维数组的关系

本文深入探讨了一维数组和二维数组的概念,解释了数组名作为指针的意义,并对比了不同类型的二维数组表示方法,如int a[10][10]与int *b[10]的区别。

首先可以理解,一维数组的数组名可以等效为指向数组首元素地址的指针,而且是一个特殊的,记录了数据类型大小的指针。因此,当int p[10]时,我们才可以用*(p+i)来等效p[i]。如果没有记录数据类型大小,即便知道首元素的地址,也无法得知(p+i)究竟指向p后面多少乘以i个字节。


同时,二维数组实际上可以等效为一个超大的“一维数组”(这不是废话么…连内存都是这样等效的),只不过是一个特殊的,记录了列数信息,自动可以计算索引的“一维数组”。所以,int a[10][10]的a可以理解为指向int类型数组的首元素地址的指针,只不过带有列数信息而已。


而int *b[10]的b是一个指向int *的指针,也即指向指针的指针(b[i]是int *类型,b是int **类型)。如果b[i]关联上元素类型为int的数组,此时b也可以用来表示一个二维数组。


表面上看,a,b都能(依靠一些符号)表示一个二维数组,但它们本质是完全不同的。严格来说,用int **表示的二维数组不是我们默认理解的,像int a[10][10]一样的“矩形的”二维数组。因为用int **表示的二维数组的不同行完全可以可以有不同的“列数”。


实例见下:

int m = 10, n = 20;

int **a; // a是指向指针的指针类型(a:int **)
	
int *b[10]; 
// b是的一维数组的数组名(指向首元素的指针)
// 数组元素类型为指向int的指针(首元素是指针)
// b是指向指针的指针类型(b:int **)
	
int *c = new int[n]; // c是int *类型
	
b[8] = c; // 无语法报错
a = b; // 无语法报错
	

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陶晨毅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值