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++相对更偏底层,我们会发现我们在子函数中求数组内部的“偷懒”方式并非能够像我们所想象的那样。

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




作者:艾孜尔江

posted @ 2020-10-30 13:53  艾孜尔江  阅读(377)  评论(0编辑  收藏  举报