数组首地址和数组第一个元素地址
一维数组
在 写程序的时候,经常会看到数组首地址和数组第一个元素的地址值相同,那么它们又什么区别呢?
这里还是以程序举例:
#include <stdio.h>
int main(void)
{
char book[50] = {"C Primer Plus"};
printf("book的首地址:%p\n", book);
printf("book[0]第一个元素的地址:%p\n", &book[0]);
printf("book[0]第一个元素的值:%c\n", book[0]);
printf("\n");
printf("book:%d\n", sizeof(book));
printf("&book[0]:%d\n", sizeof(&book[0]));
printf("book[0]:%d\n", sizeof(book[0]));
return 0;
}

分析过程:数组名book代表整个数组的首地址(把数组作为一个整体作为单位),&book[0]代表数组中第一个元素(即一个char)的地址(把数组的一个元素作为单位)。
其次,虽然数组首地址和数组第一个元素的地址相同,但数组名book首地址空间是 50,而数组第一个元素的地址空间是 4。当然数组第一个元素的空间是 1 (即一个 char 大小)

二维数组
那么对于二维数组名又代表着什么含义呢?还是以代码举例
#include <stdio.h>
#include <stdlib.h>
#define M 3
#define N 50
int main(void)
{
char arr[M][N] = {
"C Primer Plus",
"C++ Primer Plus",
"Coding Method"};
// 打印(以行为单位)
for (int i = 0; i < M; i++)
printf("%s\n", arr[i]);
printf("\n");
// 打印(以元素为单位)
for (int i = 0; i < M; i++)
{
for(int j = 0; j < N; j++)
{
printf("%c", arr[i][j]);
}
printf("\n");
}
printf("\n");
// 数组名arr
printf("arr数组名的地址:%p, sizeof(arr):%d\n", arr, sizeof(arr));
// 第0行名arr[0]
printf("arr[0]数组名的地址:%p, sizeof(arr[0]):%d\n", arr[0], sizeof(arr[0]));
// 第0行第0列元素arr[0][0]
printf("arr[0][0]元素的地址:%p, sizeof(arr[0][0]):%d\n", &arr[0][0], sizeof(arr[0][0]));
return 0;
}

二维数组名arr和第0行arr[0]、第一个元素的地址&arr[0][0] ,它们三者的地址值是相同的。但它们所代表的含义是不相同的。
结论
-
数组名和数组第一个元素的地址值相同
-
虽然地址相同,但地址所表示的内存空间不一样

浙公网安备 33010602011771号