C++求和时指针参数传值而非地址?为何arr[i]可直接取值无需解引用
关于参数传递的疑问
你提到的逻辑完全正确,调用getAverage(balance, 5)时,形参的初始化逻辑等价于int *arr = balance:
- C++中数组名在绝大多数场景下会自动隐式转换为数组首元素的指针,所以这里balance作为实参传递时,实际传入的就是数组首元素的内存地址
- 形参
int *arr接收这个地址后,arr本身就是存储了数组首地址的int类型指针
关于arr[i]取值的疑问
这是C/C++里下标运算符[]的内置语法糖特性:arr[i]本质上完全等价于*(arr + i),已经自动包含了指针偏移+解引用两步操作:
- 首先执行指针偏移:
arr + i等价于 首地址 + i * 元素类型字节数(若int占4字节则每次偏移4字节),得到第i个元素的内存地址 - 自动对偏移后的地址做解引用,直接拿到对应元素的int值
所以你完全不需要额外加*,如果写*arr[i]反而会编译报错:因为arr[i]已经是int类型的数值,不是指针,不能被解引用。如果不习惯下标写法,也可以把循环逻辑改成sum += *(arr + i);,运行效果和arr[i]完全一致。
内容的提问来源于stack exchange,提问作者4daJKong
相关产品推荐
相关产品推荐

