C与C++学习笔记:探究二维数组的数组名
C/C++:探究二维数组的数组名与数组指针
先提一嘴:一维数组的数组名
对于一个一维数组而言,其数组名是该数组的首地址,也就是一个数组首元素的指针,如下:
#include<stdio.h> int main() { int array[3]= {0}; printf("array: %p, &array[0]: %p\n", array, &array[0]); return 0; }
正题:二维数组的数组名的意义是何?
先抛结论:二维数组的数组名是一个数组指针
二维数组的数组名是一个数组指针
假设有一个二维数组array[5][5]
,那么数组名array
相当于一个数组指针ptrToArray
,我们先看看怎么声明一个数组指针。
//该指针变量指向一个一维数组 int (*ptrToArray)[5];
二维数组名的运算
我们知道:对数组指针变量ptrToArray
进行增减运算,跨越的地址为5
个int
的地址,二维数组的数组名也是如此。
/** 探究二维函数的数组名的意义 */ #include<stdio.h> int main() { int array[5][5] = { {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}, {16,17,18,19,20}, {21,22,23,24,25} }; //以地址的格式输出数组名,以及与循环变量的和 /* array + 0: 0061FEA8 array + 1: 0061FEBC array + 2: 0061FED0 array + 3: 0061FEE4 array + 4: 0061FEF8 */ printf("the address of \"array\": %p\n", array); for(int i = 0; i < 5; i ++) { printf("array + %d: %p\n", i, array + i); } //对数组名进行解引用并输出 //the val of "*array": 6422184 //显然这不是数组中某个元素的值,所以*array应该是一个指针 printf("the val of \"*array\": %d\n", *array); //以地址格式输出*array //the adress of "*array": 0061FEA8 printf("the adress of \"*array\": %p\n", *array); for(int i = 0; i < 5; i ++) { printf("*array + %d: %p\n", i, *array + i); } return 0; }
对比数组指针的运算
#include<stdio.h> int main() { int array[5][5] = { {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}, {16,17,18,19,20}, {21,22,23,24,25} }; int (*ptrToArray)[5] = array; //以地址的格式输出数组指针,以及与循环变量的和 /* ptrToArray + 0: 0061FEA8 ptrToArray + 1: 0061FEBC ptrToArray + 2: 0061FED0 ptrToArray + 3: 0061FEE4 ptrToArray + 4: 0061FEF8 */ printf("the address of \"ptrToArray\": %p\n", ptrToArray); for(int i = 0; i < 5; i ++) { printf("ptrToArray + %d: %p\n", i, ptrToArray + i); } //对数组指针进行解引用并输出 //the val of "*ptrToArray: 6422184 printf("the val of \"*ptrToArray\": %d\n", *ptrToArray); //以地址格式输出*ptrToArray //the adress of "*ptrToArray": 0061FEA8 printf("the adress of \"*ptrToArray\": %p\n", *ptrToArray); for(int i = 0; i < 5; i ++) { printf("*ptrToArray + %d: %p\n", i, *ptrToArray + i); } return 0; }
可以发现,array
与 array + 1
相差了20
个字节,即5
个int
的宽度,而*array
与*array + 1
相差了4
个字节,即1
个int
宽度。
总结
通过这些特征,不难发现二维数组的数组名其实等价于数组指针,指向第一个一维数组,对其增减可使其指向其他一维数组; 对数组名的解引用进行增减,可以使其指向一维数组中的各个元素
其实三维数组的数组名也是一个数组指针,不过是一个指向二维数组的指针,感兴趣可以看看这篇博客:
C语言之三维数组