【问题标题】:pointers to array - c programming [duplicate]指向数组的指针-c编程[重复]
【发布时间】:2012-11-06 12:08:14
【问题描述】:

可能重复:
Sizeof an array in the C programming language?
Why sizeof(param_array) is the size of pointer?

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

【问题讨论】:

  • 为什么你一直说指向数组的指针是 void 类型的? “数组指针”的类型取决于数组中的内容。
  • Why is a pointer to an array a pointer of type void? 这个问题的第一个问题是你的第一个代码块中没有指针......第二个整体问题pointers are not arrays, arrays are not pointers.
  • Why is a pointer to an array a pointer of type void? 哪里来的?

标签: c arrays pointers sizeof void


【解决方案1】:

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

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

void printSizeOfArray(int a[3]);

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

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

【讨论】:

  • 但是为什么指向数组的指针是无效的?
  • 这是不正确的。 “void printSizeOfArray(int a[3])”和“void printSizeOfArray(int *a)”是一样的。即使参数是“int a[3]”,sizeof(a) 仍然是 sizeof(int *)。
  • 自己看看:ideone.com/ArVvMu
  • 我看到的声明数组参数大小的唯一有效用途是作为文档,说明需要多少元素。
【解决方案2】:
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 的指针。您也可以使用void * 来指向它,因为void * 是无类型的(它可以指向任何东西)。

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

  • 它不应该打印 4。你的问题应该是“为什么它打印 8 而不是 32?”。它打印 8,因为这是表示系统上指向 int 的指针的字节数,而 it 是指向 int 的指针。如果您输入了sizeof(a),您应该会看到<array_size> * sizeof(int) 的结果,所以这很可能是您系统上的4*832

【讨论】:

    【解决方案3】:

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

    注意一件事:

    void printSizeOfArray(int a[])
    

    void printSizeOfArray(int *a)
    

    都一样

    【讨论】:

      猜你喜欢
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多