指向int类型数组的指针的大小是多少?

时间:2014-09-05 13:10:40

标签: c arrays pointers

我有以下代码

#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如何处理指向数组的指针?

4 个答案:

答案 0 :(得分:5)

  

'arr'也是指向整数

的指针

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

  

C如何处理数组的指针?

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

  • 执行sizeof(arr)后,您将获得number of elements * size of int的数组大小。
  • 执行sizeof(ptr)时,您将获得指针size of int的大小。
  

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

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

答案 3 :(得分:0)

如果将数组应用于原始数组,

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);
}