Loading

数组首地址和数组第一个元素地址

一维数组

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

这里还是以程序举例:

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

结论

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

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

posted @ 2023-03-22 16:45  eiSouthBoy  阅读(539)  评论(0)    收藏  举报