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++相对更偏底层,我们会发现我们在子函数中求数组内部的“偷懒”方式并非能够像我们所想象的那样。
我们都知道,参数的传递是把实参的值或副本或地址传递给形参,但数组较例外,数组传递时只会传递数组的首地址,函数在后面需要用到数组元素时再根据首地址和下标去找,因而这就导致了刚开始的错误。 所以一般都是在主函数/调用的地方中求出数组的具体长度,然后将长度作为参数传递给子函数。
作者:艾孜尔江
标签:中求,int,C++,子函数,数组,长度 来源: https://www.cnblogs.com/ezhar/p/13901733.html