数组长度...使用sizeof运算符时的不同输出

Ana*_*ziz 2 c arrays sizeof

所以我只是在玩代码来查找数组长度....原始代码是:

#include<stdio.h>

int main()
{   int al;
    int a[] = {1,2,3,4,5};
    al= sizeof(a) / sizeof(a[0]);
    printf("%d",al);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这给了我输出:

但是当我把表达式改为:

al= sizeof(&a[0]) / sizeof(a[0]);
Run Code Online (Sandbox Code Playgroud)

它给了我输出

2

如果a&a[0]......那么为什么会这样?另外,如果&a代替&a[0]答案也是2.

Sou*_*osh 8

不,他们的类型不同.

对于sizeof运算符的上下文,a属于类型int [5],但是&a[0]属于类型int *.它们确实有不同的大小.按照相同的类比,&a类型int (*)[5]- 基本上是指针.

所以,对于表达

al= sizeof(a) / sizeof(a[0]);
Run Code Online (Sandbox Code Playgroud)

是相同的

al= sizeof( int [5]) / sizeof(int);
Run Code Online (Sandbox Code Playgroud)

这给了你5.另一方面,

al= sizeof(&a[0]) / sizeof(a[0]);
Run Code Online (Sandbox Code Playgroud)

是相同的

al= sizeof(int *) / sizeof(int);
Run Code Online (Sandbox Code Playgroud)

现在看来,在你的平台上,它sizeof(int *)是8并且sizeof(int)是4,所以你可以看到2的结果.

请记住,在某些情况下,数组类型衰减到指向数组的第一个元素的指针,但是其中一个例外情况是,当数组用作运算sizeof符的操作数时.

  • @AnasAziz`sizeof()`不是函数,它在编译时被预处理.在某些时候,所有数组都作为指针处理,它们也隐式转换为指针,但只有在编译时,编译器才知道这是一个数组,它的实际大小是多少.`sizeof()`无法从它的指针中分辨出数组的大小,这就是为什么它会给你指针的大小(8,对于64位指针). (2认同)
  • @Havenard`sizeof`不是通常所说的"预处理器"的一部分; 你不能在预处理器算术中使用它.此外,"在某些时候所有数组都被作为指针处理"并不是真的,这种虚假陈述是导致初学者首先对这个问题感到困惑的原因 (2认同)