C与C++学习笔记:探究二维数组的数组名

C与C++学习笔记:探究二维数组的数组名

C/C++:探究二维数组的数组名与数组指针

先提一嘴:一维数组的数组名

对于一个一维数组而言,其数组名是该数组的首地址,也就是一个数组首元素的指针,如下:

#include

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

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

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语言之三维数组

相关推荐

“秋”的五笔编码是什么、“秋”五笔怎么样拆分、“秋”怎么读、“秋”笔画、“秋”意思
DOTA性价比超高道具谁用谁知道!连击刀超详细分析
Wise常见问题解答:汇款、验证、账户全解答
快照是什么,快照如何储存?
365bet在线足球开户

快照是什么,快照如何储存?

⌛ 10-13 👁️ 8471
中国的博彩业合法之路有多长, 看全球十大赌城
365bet在线足球开户

中国的博彩业合法之路有多长, 看全球十大赌城

⌛ 09-07 👁️ 5265
梯的成语
365bet足球直播

梯的成语

⌛ 08-24 👁️ 8869