C/C++不能在子函数中求主函数中的数组长度

#include <iostream> using namespace std; //直接在调用的时候传入长度的方法才是正确的 int getLengthCorrectly(int arr[], int length) { //相当于 int* arr int sum=0; for(int i=0; i<length; i++) { sum+=arr[i]; } return sum; } void getLengthInError(int arr[]) { //相当于 int* arr //下方输出的是数组首元素所在的地址 cout << "The address of the first index in array is: " << arr << endl; //下方输出的是数组下标第一个元素的长度,因为所在地址的值是0x6ffe00,所以会是8 cout << "The size of first index's address in array is:" << sizeof(arr) << endl; //8 //用首元素所在的地址长度除去一个整型变量所占的字节数4,就是8/4=2 int length=sizeof(arr) / sizeof(arr[0]); cout << "The final calculated length is: " << length << endl; //2 } int main() { int arr[] = { 3, 1, 2, 4 }; int length=sizeof(arr) / sizeof(arr[0]); //在主函数中计算的时候,不会出现只计算首元素地址长度的情况 cout << "Length(correct) got in Main function is: " << length << endl; // int result = getLengthCorrectly(arr, length); getLengthInError(arr); return 0; }

初学者在使用C/C++编写获取数组长度的代码时会发现一个错误,经过反复调试发现:在主函数中求长度和在子函数中求长度的结果不一样。至于为什么要在子函数中获取数组的长度,无非就是习惯于C#或者Java那种一个函数传过来直接就可以通过array.Length获取数组长度的方式,不想再在调用时多传一个关于数组长度的参数。
然而由于C/C++相对更偏底层,我们会发现我们在子函数中求数组内部的“偷懒”方式并非能够像我们所想象的那样。

我们都知道,参数的传递是把实参的值或副本或地址传递给形参,但数组较例外,数组传递时只会传递数组的首地址,函数在后面需要用到数组元素时再根据首地址和下标去找,因而这就导致了刚开始的错误。 所以一般都是在主函数/调用的地方中求出数组的具体长度,然后将长度作为参数传递给子函数。




作者:艾孜尔江


__EOF__

本文作者艾孜尔江
本文链接https://www.cnblogs.com/ezhar/p/13901733.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   艾孜尔江  阅读(399)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示