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

问题描述 投票:-1回答:1

我对数组的大小(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


}

[为什么函数IntArrayLength返回2的值,而表达式(sizeof(array) / sizeof(array[0]))返回正确的值,当未放入函数时。

提前感谢!

c++ arrays int sizeof
1个回答
0
投票

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

所以此函数声明

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))

并且通常根据指针和整数的大小产生1或2。

您可以编写类似的模板函数

template <size_t N>
size_t IntArrayLength( int ( &Array )[N] ){
  return (sizeof(Array) / sizeof(Array[0]));
}

或只是

template <size_t N>
size_t IntArrayLength( int ( &Array )[N] ){
  return N;
}

其中将参数声明为对数组abd的引用,您将得到期望的结果。

© www.soinside.com 2019 - 2024. All rights reserved.