2026-06-25 03:51:35数组首地址和数组第一个元素地址

一维数组

在 写程序的时候,经常会看到数组首地址和数组第一个元素的地址值相同,那么它们又什么区别呢?

这里还是以程序举例:

#include

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

#include

#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] ,它们三者的地址值是相同的。但它们所代表的含义是不相同的。

结论

数组名和数组第一个元素的地址值相同

虽然地址相同,但地址所表示的内存空间不一样