指针的深入理解(一)

这一节主要复习数组指针,int (* )[ ] 就是数组指针类型的标志。

因为有()将*括起来,所以(*)表示一个指针。[ ] 表示数组,所以(*)[  ]就表示一个指向数组的指针, int是数据的类型。所以int (*) [  ]表示指向一个数组的指针,元素类型是int, 个数是[  ]里面的数。

数组指针和二维数组联系

数组指针经常和二维数组连用,二维数组传参,传送的是首元素的地址,但是对于二维数组来说,其实第二个方块才是元素个数,比如

int arr[3][5] = { 0 };

对于arr[3][5]来说,arr[3]是一个元素, 5是元素的个数。所以,二维数组的首元素地址其实是arr[3]这个一维数组的地址,那么就需要使用数组指针接收。

如图:

指针的深入理解(一)_第1张图片

数组指针和二级指针的区别

 对于一个数组指针,想要确定访问一个确定的元素,那么就需要进行两次解引用,有点类似于二级指针,但是本质是不同的。接下来看一下数组指针如何进行访问

指针的深入理解(一)_第2张图片

 由于数组指针解引用的方式和二级指针有点类似,这里看一下二级指针如何进行解引用:

指针的深入理解(一)_第3张图片

 二级指针和数组指针在运用时有点类似,但是其本质截然不同,下面为内存存放本质:

指针的深入理解(一)_第4张图片 

 二位数组在内存中存放的方式其实并不是一个3 * 4二维平面,其实内存是一个个连续的内存单元。所以其又可以表示成这样:

指针的深入理解(一)_第5张图片所以在数组指针的两次解引用我们可以看到,第一次解引用控制的是行,第二次解引用控制的是列。

下面来看二级指针:

指针的深入理解(一)_第6张图片

在这里,arr1是一个数组, arr2是一个数组, arr3是一个数组。是不连续的。

parr是一个一级指针数组, 里面有三个元素。 里面的每一个元素分别指向一个数组的首地址。而pparr是一个二级指针, 指向的是parr这个一级指针数组。 

通过指针的偏移以及第一次解引用来确定访问一级指针数组里面的第几个元素。假如要访问parr数组里面的第二个元素, 就要偏移一个单位, 然后进行解引用。即 :*( pparr + 1), 这样即访问到了parr数组中的第一个元素。

即这样:

指针的深入理解(一)_第7张图片

这样就拿到了parr【1】 

此时parr[1]指向的是arr2数组, 然后通过偏移量解引用就可以访问arr2中的元素。通过指针的偏移以及第二次解引用访问arr2中的元素。比如想要访问arr2数组的第二个元素, 即一个偏移量。

即 *(*(pparr + 1) + 1);

如图:
指针的深入理解(一)_第8张图片

你可能感兴趣的:(C语言专栏,c语言)