C++ C++;-为什么sizeof在函数中用作返回值时返回数组的假值

C++ C++;-为什么sizeof在函数中用作返回值时返回数组的假值,c++,arrays,int,sizeof,C++,Arrays,Int,Sizeof,关于数组的大小(int、char等),我有一个小问题。首先,我要告诉你,我是C++初学者,在一些其他编程语言中有一些背景。现在让我们考虑下面的程序: int IntArrayLength(int Array[]){ return (sizeof(Array) / sizeof(Array[0])); } int main(){ int array[] = {10,20,30,40,50}; cout << (sizeof(array) / sizeof(arr

关于数组的大小(int、char等),我有一个小问题。首先,我要告诉你,我是C++初学者,在一些其他编程语言中有一些背景。现在让我们考虑下面的程序:

int IntArrayLength(int Array[]){

  return (sizeof(Array) / sizeof(Array[0]));
}

int main(){ 

   int array[] = {10,20,30,40,50};
   cout << (sizeof(array) / sizeof(array[0])) << endl; // returns 5, which is the correct value
   cout << IntArrayLength(array) << endl; // returns 2, no matter how many elements are in the array


}
int intarraylelength(int数组[]){
返回(sizeof(数组)/sizeof(数组[0]);
}
int main(){
int数组[]={10,20,30,40,50};

cout编译器将声明为具有数组类型的函数参数调整为指向数组元素类型的指针

所以这个函数声明

int IntArrayLength(int Array[]);
int IntArrayLength(int *Array);
由编译器调整为以下声明

int IntArrayLength(int Array[]);
int IntArrayLength(int *Array);
两者都声明了相同的一个函数

您甚至可以在程序中一起编写这些声明,尽管它们是多余的

int IntArrayLength(int Array[]);
int IntArrayLength(int *Array);

int IntArrayLength(int Array[]){

  return (sizeof(Array) / sizeof(Array[0]));
}
传递的数组被转换为指向其第一个元素的指针

所以在函数中,表达式

(sizeof(Array) / sizeof(Array[0]))
(sizeof(int *) / sizeof( int))
与表达式相同

(sizeof(Array) / sizeof(Array[0]))
(sizeof(int *) / sizeof( int))
根据指针和整数的大小,通常会产生1或2

您可以编写一个模板函数,如

template <size_t N>
size_t IntArrayLength( int ( &Array )[N] ){
  return (sizeof(Array) / sizeof(Array[0]));
}
模板
大小\u t插入长度(整数和数组)[N]){
返回(sizeof(数组)/sizeof(数组[0]);
}
或者只是

template <size_t N>
size_t IntArrayLength( int ( &Array )[N] ){
  return N;
}
模板
大小\u t插入长度(整数和数组)[N]){
返回N;
}

如果将参数声明为对数组的引用,您将得到expecred结果。

C++17
有一个函数用于此:您可能希望切换到使用
std::array
,而不是使用C数组。