C语言二维数组的指针变量(指向二维数组的指针)详解

1.1二维数组地址的概念:

在 C 语言中定义的二维数组实际上是一个一维数组, 这个一维数组的每个成员又是一个一维数
组。 如有下面定义:
int *p, a[3][4];
则可把a 数组看成由 a[0]、 a[1]、 a[2]三个元素组成, 而 a[0]、 a[1]、 a[2]每个元素又分别是由 4 个整型元素组成的一维数组。 可用 a[0][0]、 a[0][1]等来引用 a[0]中的每个元素,可用 a[1][0]、 a[1][1]等来引用 a[1]中的每个元素, 其它依此类推。        

表示含义形式地址
a二维数组名, 数组首地址2000
a[0], *(a+0), *a 第 0 行第 0 列元素地址 2000
a+1第 1 行首地址 2008
a[1], *(a+1) 第 1 行第 0 列元素地址 2008
a[1]+2, *(a+1)+2, &a[1][2]第 1 行第 2 列元素地址 2012
*(a[1]+2),*(*(a+1)+2),a[1][2] 第 1 行第 2 列元素的元素值13
#include<stdio.h>
#define FORMAT "%d,%d\n"
int main()
{
		int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
		printf(FORMAT, a, *a);
		printf(FORMAT, a[0], *(a + 0));
		printf(FORMAT, &a[0], &a[0][0]);
		printf(FORMAT, a[1], a + 1);
		printf(FORMAT, &a[1][0], *(a + 1) + 0);
		printf(FORMAT, a[2], *(a + 2));
		printf(FORMAT, &a[2], a + 2);
		printf(FORMAT, a[1][0], *(*(a + 1) + 0));
	return 0;
}

代码运行结果:

242940712,242940712
242940712,242940712
242940712,242940712

242940728,242940728
242940728,242940728

242940744,242940744
242940744,242940744

9,9  //只有这一个为元素值,其他都为地址

1.2 通过建立一个行指针来引用二维数组元素

若有以下定义:
int a[3][4],(*ptr)[4];
在这里, 说明符(*ptr)[4]中, 由于一对圆括号的存在,所以*号首先与 ptr 结合,说明 ptr 是一个
指针变量,然后再与说明符[4]结合,说明指针变量 ptr 的基类型是一个包含有四个 int 元素的数组。
在这里,ptr 的基类型与 a 的相同,因此 ptr=a;是合法的赋值语句。 ptr+1 等价于 a+1、 *(ptr+1)等价于a[1]。 当 ptr 指向 a 数组的开头时, 可以通过以下形式来引用 a[i][j]:
(1) *(ptr[i]+j) /* 与*(a[i]+j)对应 */
(2) *(*(ptr+i)+j) /* 与*(*(a+i)+j)对应 */
(3) (*(ptr+i))[j] /* 与(*(a+i))[j]对应 */
(4) ptr[i][j] /* 与 a[i][j]对应 */

在这里, ptr 是一个指针变量, 它的值可变, 而 a 是一个常量。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值