二维数组、指针数组、行指针、二级指针间的关联

本文详细解析了一维数组、二维数组、指针数组、二级指针及行指针之间的内在联系与转换方法,并通过实例演示了如何在C/C++中灵活使用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二维数组、指针数组、二级指针、行指针互转

1. 一维数组

在讲二维数组之前,先回忆一维数组。

定义一个一维数组int a[10],其内存结构如图:

 

1

在中括号[]之前的a表示数组的首地址,a+i则表示第iint型数据的地址,通过*解引用,来索引具体的数据。

2. 二维数组与指针数组、二级指针

 

2

先有如下定义:

int **q;

int *p[3];

int a[][3] = { 1,2,3,4,5,6,7,8,9 };

p[0] = a[0];

p[1] = a[1];

p[2] = a[2];

q = p;

则可用*(*(p+i)+j)*(*(q+i)+j)对数组内的每个元素进行索引。

内存结构如上图2蓝色虚线框内。

3. 二维数组与行指针

先有如下定义:

int a[][3] = { 1,2,3,4,5,6,7,8,9 };

int (*p)[3];

一维数组表示数据的数组,而二维数组则表示数组的数组,最外层为一个数组(对应行),内部存储一个一维数组,所有的外\内的数组内的数据都是地址。

二维数组的a表示行指针,通过*a解引用,得到a[0](*a&a[0][0]),得到每一行数组元素的首地址,此后索引方式同一维数组,通过a[i]+j来得到每个元素的具体地址。

此处注意a*a得到的地址实际上是一样的,只是逻辑含义不一样而已。

那么到这里我们已经了解了二维数组的存储结构,此时我们再说行指针是如何使用的,如下:

int (*p)[3];//个数必须同二维数组列元素个数相等

p=a+1;//表示获得第一行首地址(与第一行元素首地址区别,虽然值是一样的,但含义不一样)

*pa+1向内前进一层,得到第一行元素首地址,然后通过(*p)[i]来索引具体元素的值,实际上就是起到将二维数组部分(仅访问其中一行,故为部分)转为一维数组的作用。

4. 引伸应用

3中讲了将行指针a通过*a前进一步得到第0行元素首地址,那么思考如果将一维数组的b[3]首地址b取地址&b(即加引用),是不是就得到了对应的行指针,验证:

int b[3] = { 1,2,3};

cout << *((int *)*(&b+ 1)-1)<< endl;//3

验证成功,图解如下图3

 

3

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值