我有以下代码
#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如何处理指向数组的指针?
答案 0 :(得分:5)
'arr'也是指向整数
的指针
不,不是。 arr
是一个数组。数组的大小是元素的大小乘以元素的数量。如果它是一个指针,它的大小将与任何其他指针相同。
C如何处理数组的指针?
C处理指向数组的指针的方式与处理所有其他指针的方式相同。但是,代码中没有指向数组的指针,只有指向int(ptr
)的指针。
答案 1 :(得分:3)
指针只是一个内存地址,因此在32位系统上它总是4个字节。根据环境,在64位系统上为4或8个字节。
您的示例中没有真正的混淆。 arr
是一个由4个32位整数组成的数组,因此是16个字节。它作为指向第一个int的指针int*
被处理,或者传递,这就是为什么你可以将它复制到该类型的其他变量的原因,显式或作为参数。此时不再与原始数组建立关系,它只是一个指针 - 系统上的4个字节。
查看它的最佳方式是可以从int[]
到int*
进行隐式转换,就像从char
到int
一样。
答案 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);
}