c++ - 为什么这个指针是 8 个字节?
问题描述
我正在学习 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 个。它们不应该是一样的吗?
解决方案
他们不应该是一样的吗?
No.a
是(应该是)一个数组(但因为它是一个函数参数,已被调整为指向第一个元素的指针),因此具有指针的大小。您的机器似乎有 64 位地址,因此,每个地址(因此,每个指针)都是 64 位(8 字节)长。
a[0]
另一方面,该数组的元素具有 (an int
) 的类型,并且该类型在您的机器上具有 32 位(4 个字节)。
推荐阅读
- android - 可以为库项目跳过 TargetSdkVersion(27 到 29)吗?
- javascript - 如何为这段代码编写 Jasmine 单元测试
- angular -
从上层组件。角 7 - azure-cosmosdb - 重新运行 Lease Collection 中的所有更改
- c# - 打开和关闭文件夹中的所有 Excel 文件
- angular - primeNG 升级到 8.0.1 错误加载 DataTable
- testcontainers - 测试容器中的 GenericContainer 应该如何参数化?
- python - Django:过滤多对多字段
- powershell - Write-verbose 的格式化输出
- javascript - 寻找与 HTML 5 和 Webvtt 文档同步视频的想法