学习深度学习框架源码有感 | 反正我不会C语言

在上一篇文章中,有人留言问:数组指针这种结构存在的意义?其实刚开始我也是这么问的,这玩意有什么用?到后来我才知道,原来他居然就是多维数组。本文将展开讨论为什么数组指针可用作多维数组。PS.我已经不敢说我会C语言了。

1.数组名中包含的小细节

在这之前,我们先来介绍下C语言中的数组名所代表的含义。本文主要介绍数组名和数组名取地址,这两者的区别与联系。如下图所示,数组名代表了指向数组首元素的(指针)地址,而对数组名取地址后其代表的是指向整个数组的(指针)地址。从下图中我们也可以发现,对前者的指针加1,指针就移动四个字节(32位平台),相当于指向数组的下一个元素。而对后者的指针加1,指针就移动4*数组长度个字节,相当于指针指向了数组的末尾。这就是这两者的区别。

2.多维数组名

理解了上述数组名的含义后,我们将进一步探讨多维数组名及其特点。如下图所示,二维数组名代表了指向数组第一行的(指针)地址,根据上述一维数组名的解析,我们可以推出,对二维数组名*操作后其代表的是指向数组第一行首元素的(指针)地址。从下图中我们可以发现,对二维数组名加1,指针就会移动4*数组每行长度个字节,相当于指向数组下一行。而对每一行的指针取*操作,并加1,指针就移动4个字节,就会指向当前行当前元素的下一个元素。

3.数组指针和多维数组名

介绍完多维数组名的真正含义后,我们来看下本文真正要讲的数组指针,相信看到这大家多少能看出来,数组指针这玩意肯定和多维数组名有点联系,那么到底有什么联系,请看下面代码段。

如下代码所示,代码中利用第三种方式定义数组指针。(定义方式)代码段中把二维数组的数组名赋值给了数组指针,然后我们可以像操作多维数组一样,操作数组指针,当然需要注意的是每个数组指针指向的内存空间大小需要与对应二维数组的列数一致。那么讲到这相信我就不用多说了,没错,数组指针这玩意就这样和我们熟悉的二维数组结合在了一起。

int array[3][4] = {0};

//定义一个指向数组的指针变量 
int (*pArray)[4] ;//告诉编译器  分配 4个字节的内存 32bit平台下
pArray = a;

printf("\n");
for (i=0; i<3; i++)
{
	for (j=0; j<4; j++)
	{
		printf("%d ", pArray[i][j]);
	}
}

学习指针学多了之后,更加明确了指针作为C语言核心的地位,更能体会到指针的强大和灵活。另外,就像上文中在介绍数组和多维数组名时都利用了画图的方式,其实这是一种列举出指针内存模型的方式。很显然,利用内存模型学习指针,能够让我们在大脑中构建内存地图,能够更加清晰的捋清楚代码中的脉络。

发布了233 篇原创文章 · 获赞 187 · 访问量 40万+

猜你喜欢

转载自blog.csdn.net/qiu931110/article/details/94858094