c语言关于指针的小问题

#include
//注本机是64位系统
void test(int arr[]){//等价于*arr
int num=sizeof(arr)/sizeof(arr[0]);
printf("%d\n",num);//2
}
int main(){
int arr[10]={0};
test(arr);
printf("%d",sizeof(arr)/sizeof(arr[0]));//10
return 0;
}
分析一下函数中输出为什么是2

int num=sizeof(arr)/sizeof(arr[0]);
这个在函数中是无效的
在函数中只知道arr是个int*类型,不知道它是数组,更不知道数组有多少个元素。
sizeof(arr)得到的是指针的大小,也就是4,而不是数组所占的空间大小

test函数中的参数虽然你写成int arr[]形式,
实则编译都会默认当做指针int *arr形式处理的。

而指针本身的大小默认等于系统字长,系统64位,那么指针大小就是8字节。

所以这test形参里面的sizeof(arr)=8
而arr[0]该指针指向第一个元素,因为该元素是int型,而int型默认字节4。

所以test 函数里面的
sizeof(arr)/sizeof(arr[0])=8/4=2