二维数组名的本质

本人是一个C语言小白,二维数组名到底是啥?一直困扰着我,不过现在我想通了。现在把我的心得分享给大家:

首先:大家肯定知道一维数组名是首元素的地址。那么二维数组名是否是二维数组首元素的地址呢??带着这个问题,我们来写个程序验证一下:

定义一个2行3列的二维数组

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

二维数组名a不用说肯定是一个指针,我们知道一维数组名是一个指向首元素的指针,我们是通过指针步长来判断的(即:指针进行+1所跳过的字节数)那么二维数组名的步长是多少呢?

	printf("a:%d, a+1:%d\n", a, a+1);
	//a:10484556, a+1:10484568 相差12

我们发现,步长是12,我们创建的是一个2行3列的二维数组,每一行的字节数正好是12(即:元素个数*每个元素所占字节数 = 12)所以可以得出二维数组名是一个指向每一行的指针。


怎样得到指向整个二维数组的指针呢?

printf("&a:%d, &a+1:%d\n", &a, &a+1);
	//&a:10484556, &a+1:10484580 相差24

直接看上面的代码,在二维数组名前面加上&之后,指针的步长是24,那么就说明,+1之后跳过了整个二维数组,是不是觉得和一位数组很相似呢。


我们继续探究,我想你一定还有一个地方想不同,那就是int a[2][3]中的a[2]是神马呢??

还是老套路,我们通过指针步长来判断:

	printf("a[0]:%d, a[0]+1:%d\n", a[0], a[0]+1);
	//a[0]:10484556, a[0]+1:10484560 相差4

我们发现相差4,是不是好像有点明白了,没错在二维数组中a[0]是指向每一行的首元素的。+1之后自然就是指向这一行的第i个元素了。


上面这些问题都明白了,我猜你肯定,还有一些疑问。

一些书上说&a[0], &a的区别说的很啰嗦,其实,就是指针的步长的不同嘛!

printf("&a[0]:%d, &a:%d\n",&a[0], &a);
	//&a[0]:10484556, &a:10484556 相同

我们发现,它俩的地址竟然一样。那么是否可以判断它俩一样呢?答案是否定的!!

printf("&a[0]+1:%d, &a+1:%d\n", &a[0]+1, &a+1);
	//&a[0]+1:10484568, &a+1:10484580

和上面的数据对比后,我们发现&a[0]跳了12个字节(跳过了一行),而&a跳了24个字节(跳过了整个二维数组)这就是它们俩的区别。


最后,二维数组其实还可以用指针表示,我觉得你只要明白了上面这些。二维数组的指针表示法肯定能搞定!你只要明白

*(a+i)等价于a[i]

最后做一下总结:

  1. 二维数组名指向行的,“&二维数组名”就指向了整个二维数组
  2. "二维数组名[i]" 是指向i行的首元素的。“&二维数组名[i]”就指向了一行

猜你喜欢

转载自blog.csdn.net/qq_18152813/article/details/81207539