c - C 中 sizeof 运算符中的参数

标签 c pointers multidimensional-array sizeof

我知道当我们在数组名称上使用 sizeof 运算符时,它会给出数组的总大小(以字节为单位)。例如

int main(int argc, const char * argv[]) {
    int a[][5] = {
        {1,2,3,4,5},
        {10,20,30,40,50},
        {100,200,300,400,500}
    };

    int n=sizeof(a);
    printf("%d\n",n);

}

它为数组的 15 个元素 提供 60 作为输出。但是当我写

int n=sizeof(*a);

它给出 20 作为第一行大小的输出,而 *a0th 元素的基地址0th 行,它的类型是一个指向整数的指针。 a 指向第一行本身。为什么会这样?

最佳答案

*aa 的第 0 行,该行是一个包含五个 int 的数组。

在大多数表达式中,数组会自动转换为指向其第一个元素的指针。因此,当您在诸如 int *x = *a; 的语句中使用 *a 时,*a 将转换为指向它的指针第一个元素。这导致指向 int 的指针,可以将其分配给 x

但是,当数组是 sizeof 运算符、一元 & 运算符或 _Alignof_ 运算符的操作数时,它不是转换为指向其第一个元素的指针。此外,用于初始化数组的字符串文字数组不会转换为指针(因此,在 char foo[] = "abc"; 中,"abc" 用作数组来初始化 foo;它不会转换为指针)。

关于c - C 中 sizeof 运算符中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51478342/

相关文章:

arrays - 将假定等级实体写入文件

c - 使用带有指向双指针的指针的 scanf()

c++ - 初始化程序错误太多

c - 为什么我必须按 CTRL + Z 3 次才能发送 EOF?

c - Socket UDP 客户端内存泄漏

c - C 中获取二维数组的长度

c++ - 指针的部分特化,C++

c++ - 在 tensorflow 中访问张量数据时出现段错误(在 c++ 中)

c++ - 初始化 vector 中的指针

python - 从多维 numpy 数组中选择