关于数组求长度的问题
这两天备赛复习的时候发现一个很有意思的东西,就是我们用什么办法去求一个数组的长度呢?先看这段代码:
# include <iostream>
using namespace std;
int ArryLength(int Arry[]){
return sizeof(Arry)/sizeof(Arry[0]);
}
int main(void){
int Arry[10]={1,2,3,4,5,6,7,8,9,10};
cout<<ArryLength(Arry)<<endl;
cout<<sizeof(Arry)/sizeof(Arry[0])<<endl;
system("pause");
return 0;
}
运行结果是2和10(编译器为vscode),毫无疑问后者是数组长度即元素个数,用
sizeof(Arry)/sizeof(Arry[0])
求得,但为什么定义一个返回值为int的ArryLength函数结果会大相径庭呢?原来函数调用和直接调用不同之处在于,函数调用相当于传递的是参数的引用,当数组作为参数时会自动退化为数组元素类型指针,像这个例子就会退化成一个int*,返回的也是一个int型指针(on array function parameter ‘Arry’ will return size of ‘int*’),那么函数返回值实际上是:
sizeof(int*)/sizeof(Arry[0])=8/4=2
且不同编译器可能取sizeof(int*)为4,这样结果就一直是1或2;而直接调用相当于是求出整个数组所占用的存储空间,再除以单个元素所占的存储空间得到长度:
sizeof(int)*Length/sizeof(Arry[0])=Length
关键在于要记住数组作为形参时返回一个类型指针。