我正在学习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个字节,难道它们不是相同的吗?
发布于 2021-11-17 00:05:11
他们不应该是一样的吗?
不是的。a (意为)数组(但因为它是函数参数,已调整为指向第一个元素的指针),因此具有指针的大小。您的机器似乎有64位地址,因此,每个地址(因此,每个指针)都是64位(8字节)长。
另一方面,a[0]是该数组的元素具有( int)的类型,而该类型在计算机上有32位(4个字节)。
发布于 2021-11-17 00:02:58
指针只是变量开始位置所在的内存地址。这个地址是8个字节。
a[0]是数组的第一个变量。从技术上讲它可以是任何大小的东西。当您接受指向它的指针时,指针只包含一个内存地址(整数),而不知道或不关心这个地址包含什么。(这只是为了说明这个概念,在问题中的示例中,a[]是一个整数数组,但是相同的逻辑适用于任何东西)。
注意,指针的大小在不同的体系结构上实际上是不同的。这就是32位,64位,等等出现的地方。它也可以依赖于编译器,但这是不可能的。
发布于 2021-11-17 00:04:58
指针的大小取决于系统和实现。您使用64位(8个字节)。
a[0]是一个整数,标准只给出它必须存储的最小最大值的指示。它可以是从两个字节以上的任何东西。大多数现代实现使用32位(4字节)整数。
sizeof(a)/sizeof(a[0])将不处理函数参数。数组由引用传递,此分区只提供指针大小比整数大小大多少倍的信息,而不是指针引用的对象的大小。
https://stackoverflow.com/questions/69997471
复制相似问题