我是c ++的新手,因为我编写程序来测试如何将数组作为函数中的参数传递,我写了这个小程序:
#include <iostream>
using namespace std;
void pass_by_array(int a[]) {
int a_len = sizeof(a);
int e_len = sizeof(a[0]);
cout << "size of array in func: " << a_len << endl;
cout << "size of element in func: " << e_len << endl;
}
int main() {
int foo[] = {1, 8, 2, 7, 3, 6};
int a_len = sizeof(foo);
int e_len = sizeof(foo[0]);
cout << "size of array in main: " << a_len << endl;
cout << "size of element in main: " << e_len << endl;
pass_by_array(foo);
return 0;
}
这是我得到的结果:
size of array in main: 24
size of element in main: 4
size of array in func: 8
size of element in func: 4
那到底是怎么回事?数组的大小改变了吗?!
答案 0 :(得分:4)
当您将数组传递给函数时,它会衰减为指向其第一个元素的指针。因此,sizeof(a)
实际上为int
提供了指针的大小。在您的计算机上,它似乎是8。
如果要将数组传递给函数,使得数组仍然知道它的大小,请使用std::vector
或std::array
,而不是普通的C风格数组。
答案 1 :(得分:0)
根据您的计划:
int a_len = sizeof(foo);
int e_len = sizeof(foo[0]);
是function
variable
,因此compiler
可以将其解释为array
,因为它位于函数的stack frame
declared
}和initialized
。
对于您的计划:
main()
当你将数组传递给另一个函数时
pass_by_array(foo);
它被转换为在接收函数的堆栈帧中定义的指针,并存储数组的地址。
因此根据您的计划:
int a_len = sizeof(a);
int e_len = sizeof(a[0]);
第一个语句会根据int* a
为您提供sizeof (pointer)
的大小,即int
或compiler
。
由于指针可以用作数组a[0]
,它将为您提供sizeof(int)
希望这有助于您理解。