函数与main内用指针算术求数组长度结果不同的原因
问题原因解析
核心差异来自数组作为函数参数时的类型退化:
在main函数中的行为
当你在main里定义数组(比如int arr[N];)时,arr的类型是int[N](N个int的数组):
&arr是指向整个数组的指针,类型为int (*)[N]&arr + 1会向后偏移整个数组的字节大小,指向数组末尾的下一个位置*(&arr + 1)会被隐式转换为指向该位置的int*指针,和arr(同样隐式转为指向首元素的int*)相减时,C语言会计算两个指针之间的元素个数,结果正好是数组长度N
在自定义函数func中的行为
当你把数组传给自定义函数时,数组名会退化为指向首元素的指针,也就是arr在func里的类型是int*,而非数组类型:
&arr此时是指向这个指针变量的指针,类型为int**&arr + 1会向后偏移一个指针的字节大小(比如64位系统是8字节),指向栈上该指针变量之后的未知内存区域*(&arr + 1)是该未知区域的一个int*值,和arr(int*)相减时,计算的是两个指针地址差对应的int元素数,这个值是无意义的地址相关数值,自然不是数组长度
简单来说:main里的arr是数组本身,函数里的arr只是个指针,两者的类型本质不同,导致&arr的含义完全不一样。
内容的提问来源于stack exchange,提问作者Rani Giro
相关产品推荐
相关产品推荐

