-1

可能重复:
C 编程语言中数组的大小?
为什么 sizeof(param_array) 是指针的大小?

void printSizeOfArray(int a[])
{
    printf("%lu\n", sizeof(a));
}

int main()
{
    int it;
    int a[4] = {0};
    printSizeOfArray(a);

    return 0;
}

当我运行代码时,我得到 8。为什么指向数组的指针是 void 类型的指针?

如果指向数组的指针是 void 类型,为什么,当我写:

int *it;
int a[4] = {0};
it = a;
printf("%lu\n", sizeof(it));

它也可以吗?我怎样才能用int?

另外,为什么它在第二个中打印 8 而不是 4?它是指向数组 ( void*) 而不是int.

4

3 回答 3

1

C 中的数组通常“衰减”为仅指向第一个元素的指针。正如您所注意到的,此指针不保留有关数组大小的任何信息。当一个数组被传递给一个函数时,就会发生这种衰减。

正确的大小只能通过范围内的正确声明来计算。因此,您可以使其适用于函数,但随后数组的大小成为函数原型的一部分,这很少有用:

void printSizeOfArray(int a[3]);

这就是为什么典型的 C 代码总是单独传递大小的原因。

基本上,C 对数组的支持是“弱的”。

于 2012-11-06T12:09:56.377 回答
1
int *a;    // this is a pointer
int arr[]; // this is an array. not a pointer, not a "pointer to void"

Why is a pointer to an array a pointer of type void?

  • 它不是。这是一个数组。当你将它传递给一个函数时,它会衰减为一个指向int. 为什么你认为它是一个void *

When I run the code I get 8.

  • 这是 64 位系统上指针的大小。尝试这个:

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

  • 您会看到它是 8,因为系统上的指针占用 8 个字节。

And if a pointer to an array is of type void, why, when I write: int *it = a; It works ok as well? How can I point with an int?

  • 那是因为它衰减成一个指向int. 您也可以使用avoid *来指向它,因为它void *是无类型的(它可以指向任何东西)。

Also, why does it print 8 in the second and not 4?

  • 它永远不应该打印 4。你的问题应该是“为什么它打印 8 而不是 32?”。它打印 8 因为这是表示int系统上指向 an 的指针的字节数,并且it是指向int. 如果您这样做了sizeof(a),您应该<array_size> * sizeof(int)4*8在您的系统或32.
于 2012-11-06T12:42:21.140 回答
0

这是因为函数调用中的arrays衰减pointers,因此当您调用具有数组名称的函数时,函数中的参数实际上是该类型的指针,因此它sizeof()为您提供了pointer该机器上的大小,这就是它打印 8 的原因

注意一件事:

void printSizeOfArray(int a[])

void printSizeOfArray(int *a)

是一样的

于 2012-11-06T12:10:09.373 回答