首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个指针是8个字节?

为什么这个指针是8个字节?
EN

Stack Overflow用户
提问于 2021-11-17 00:00:26
回答 3查看 1.4K关注 0票数 2

我正在学习C++,并读到当数组被传递到函数中时,它会衰减为指针。我想玩这个游戏,并编写了以下函数:

代码语言:javascript
复制
void size_print(int a[]){
    cout << sizeof(a)/sizeof(a[0]) << endl;
    cout << "a ->: " << sizeof(a) << endl;
    cout << "a[0] ->" << sizeof(a[0]) << endl;
}

我尝试输入一个包含三个元素的数组,比如说

代码语言:javascript
复制
int test_array[3] = {1, 2, 3};

使用这个输入,我期望这个函数打印1,因为我认为a是一个整数指针(4个字节),a[0]也是4个字节。然而,令我惊讶的是,结果是2和sizeof(a) = 8

我不明白为什么a占用8个字节,但是a[0]占用4个字节,难道它们不是相同的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-17 00:05:11

他们不应该是一样的吗?

不是的。a (意为)数组(但因为它是函数参数,已调整为指向第一个元素的指针),因此具有指针的大小。您的机器似乎有64位地址,因此,每个地址(因此,每个指针)都是64位(8字节)长。

另一方面,a[0]是该数组的元素具有( int)的类型,而该类型在计算机上有32位(4个字节)。

票数 7
EN

Stack Overflow用户

发布于 2021-11-17 00:02:58

指针只是变量开始位置所在的内存地址。这个地址是8个字节。

a[0]是数组的第一个变量。从技术上讲它可以是任何大小的东西。当您接受指向它的指针时,指针只包含一个内存地址(整数),而不知道或不关心这个地址包含什么。(这只是为了说明这个概念,在问题中的示例中,a[]是一个整数数组,但是相同的逻辑适用于任何东西)。

注意,指针的大小在不同的体系结构上实际上是不同的。这就是32位,64位,等等出现的地方。它也可以依赖于编译器,但这是不可能的。

票数 2
EN

Stack Overflow用户

发布于 2021-11-17 00:04:58

指针的大小取决于系统和实现。您使用64位(8个字节)。

a[0]是一个整数,标准只给出它必须存储的最小最大值的指示。它可以是从两个字节以上的任何东西。大多数现代实现使用32位(4字节)整数。

sizeof(a)/sizeof(a[0])将不处理函数参数。数组由引用传递,此分区只提供指针大小比整数大小大多少倍的信息,而不是指针引用的对象的大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69997471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档