【发布时间】:2021-12-28 00:31:50
【问题描述】:
我正在学习 C++,并且读到当一个数组被传递给一个函数时,它会衰减为一个指针。我想玩弄这个并编写了以下函数:
void size_print(int a[]){
cout << sizeof(a)/sizeof(a[0]) << endl;
cout << "a ->: " << sizeof(a) << endl;
cout << "a[0] ->" << sizeof(a[0]) << endl;
}
我试着输入一个包含三个元素的数组,比如说
int test_array[3] = {1, 2, 3};
有了这个输入,我期待这个函数打印 1,因为我认为 a 将是一个整数指针(4 个字节),a[0] 也将是 4 个字节。然而,令我惊讶的是,结果是 2 和 sizeof(a) = 8。
我不明白为什么a 占用8 个字节,而a[0] 占用4 个字节。它们不应该是一样的吗?
【问题讨论】:
-
有趣的事实:
a[0]不是指针,因此不能合理地期望与指针大小相同。 -
sizeof(a)是数组传递衰减到的指针的大小。该函数无法知道数组的大小。 -
@WeatherVane:我认为他们理解这一点(他们清楚地知道它会衰减为指针)。我想他们只是没有意识到 64 位系统有 8 字节指针(很多旧的 C++ 教材仍然假设一切都是 32 位系统)。
-
@APM500 因为所有指针的大小都相同,无论它们的类型如何。你有一个指向
int的指针。指针为 8 个字节,因为您正在为 64 位系统进行编译。它指向的int是 4 个字节。 -
@APM500 整数指针、字符指针、浮点指针或 ifstream 指针没有什么特别之处。所有指针。您的系统上的所有 64 位。
int告诉您有关指向的内容,而不是指针本身。
标签: c++ arrays function pointers