【问题标题】:What is the size of pointer to an array of type int?指向 int 类型数组的指针的大小是多少?
【发布时间】:2014-09-05 13:10:39
【问题描述】:

我有以下代码

#include <stdio.h>
int main(void) {
    int arr[] = {10,20,30,40};
    int* ptr = arr;
    printf("%d\n",sizeof(arr));
    printf("%d",sizeof(ptr));
    return 0;
}

输出是

16
4

C 中指针的大小是 4。'arr' 也是一个指向整数的指针,但它的大小是 16,这是一个元素的大小和元素数的乘积。 另一方面,如果我将相同的指针存储到另一个指针变量中,那么它的大小将变为 4。这非常令人困惑。如果我尝试将 arr 作为参数发送给函数,然后在该函数中打印 arr 的大小,也会发生同样的事情。 C如何处理指向数组的指针?

【问题讨论】:

标签: c arrays pointers


【解决方案1】:

'arr' 也是一个整数指针

不,不是。 arr 是一个数组。数组的大小是元素的大小乘以元素的数量。如果它是一个指针,它的大小将与任何其他指针相同。

C如何处理数组指针?

C 处理指向数组的指针的方式与处理所有其他指针的方式相同。但是,您的代码中没有指向数组的指针,只有一个指向 int (ptr) 的指针。

【讨论】:

    【解决方案2】:

    指针只是一个内存地址,因此在 32 位系统上它总是 4 个字节。根据环境,它在 64 位系统上为 4 或 8 个字节。

    您的示例中没有真正的混淆。 arr 是一个由 4 个 32 位整数组成的数组,因此是 16 个字节。它被“处理”或“传递”,作为指向第一个 int 的指针,int*,这就是为什么您可以将其复制到该类型的其他变量,无论是显式还是作为参数。那时与原始数组不再有关系,它只是一个指针 - 在您的系统上为 4 个字节。

    查看它的最佳方式是从int[]int* 的隐式转换是可能的,就像从charint 一样。

    【讨论】:

      【解决方案3】:
      • 当您执行sizeof(arr) 时,您将获得数组的大小为number of elements * size of int
      • 当您执行sizeof(ptr) 时,您将获得指针的大小,即size of int

      这非常令人困惑。如果我尝试将 arr 作为参数发送给函数,然后在该函数中打印 arr 的大小,也会发生同样的事情。

      当你像foo(arr)这样发送数组时,你实际上是在发送arr的基地址。当我们将变量的地址传递给函数时,它会将地址存储在指针中。同样,如果您尝试获取 arr 的大小,您将获得指针的大小。

      【讨论】:

        【解决方案4】:

        sizeof 仅适用于将数组的长度应用于原始数组。

        int a[5]; //real array. NOT a pointer
        sizeof(a); // :)
        

        但是,当数组衰减为指针时,sizeof 将给出指针的大小,而不是数组的大小。

        int a[5];
        int * p = a; // assigning address of the array to pointer
        sizeof(p); // :(
        

        在 32 位系统上总是返回 4 个字节,在 64 位系统上总是返回 8 个字节!

        数组在传递给函数时衰减为指针,并继续在类型系统中保持数组长度。

        当您将数组传递给函数时,它会衰减为指针。所以sizeof函数会返回int *的大小

        因此,当您将数组传递给函数时,您还需要传递元素的数量-

        void function (size_t sz, int *arr) { ... }
        :
        {
            int x[20];
            function (sizeof(x)/sizeof(*x), x);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-08
          • 1970-01-01
          • 2021-02-07
          • 1970-01-01
          • 2012-03-15
          • 2018-11-23
          • 2011-12-09
          • 2012-05-12
          相关资源
          最近更新 更多