You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:10:26