c中为什么int数组传到函数之后sizeof(数组)就变成8了

img

请帮忙解答一下,为什么在函数里sizeof(A)会等于8:
#include<stdio.h>
int SumOfElement(int A[]){
printf("in SumOfElement size of sizeof(A) is %d\tsize of sizeof(A[0]) is %d\n",sizeof(A),sizeof(A[0]));
}
int main()
{
int A[]={5,6,8,4,2};
int total=SumOfElement(A);
printf("in main size of sizeof(A) is %d\tsize of sizeof(A[0]) is %d\n",sizeof(A),sizeof(A[0]));
}

在c中,数组在作为参数的时候就退化为指针,对一个地址来取大小呢,如果是32位系统的话即为4,如果是64位系统的话为8,所以呢,在函数中sizeof获取的是指针的长度而不是数组的长度。

int 类型的数组在计算大小的时候实际上计算的是 int * 的指针的大小

可以参考如下

#include<stdio.h>

int main()
{
int * p; 

printf("size of int * is %d\r\n",sizeof(p));

}

sizeof计算的是其所看到的变量的大小,而非变量最初的大小。在函数中,sizeof看到的只是整型指针类型的参数(不管实参是指针还是数组),所以给出的是指针或地址的长度,即 8

所有数组传参成数组形式,都会编译器转化成指针,因为指针的大小就是系统的位长!64位就是8,32位就是4,严格来说参数写成数组形式不是很严谨的,但编译器不会当它是错误的,例如func(int arr[],int b)
其实会被编译器转化成指针形式进行计算。
func(int *arr,int b)这样的,,加上下标就是相当于取某个位置的元素了,大小就是某元素的大小int默认大小4个字长