指针和引用位置[重复]

问题描述 投票:0回答:2

当我试图找到 Pointers 存储自己的位置、它们的地址和地址值时。与References相同。

例一:

int a = 1;
int *b = new int{ 5 };
int &c = a;

我知道

a
1
是存储在栈上的,但是他们是在同一个内存块吗?

我有信息,引用值

*b
5
存储在堆栈中,但值
5
存储在堆中。

我听说引用 a 的

&c
没有存储在内存中,因为它是别名。但是其他人说的是另一回事,所以和
*b
一样的问题,它们是如何存储在内存中的?

我认为深入了解这个话题会更有趣。

例二:

void Func1(int a)
{
// code
}

void Func2(int *b)
{
// code
}

void Func3(int &c)
{
// code
}

我知道参数

a
被复制到堆栈上的函数内存中。

我有信息说

*b
被复制到堆栈上的函数内存,但只复制了
*b
,而不是它对存储在堆中的值的引用。

听说

&c
不要复制,因为函数通过这个引用直接使用位于堆上的值。


例子 12 在记忆中是如何工作的?

我尝试使用 Google、Bing AI 和 ChatGPT 寻找这个问题的答案,但答案各不相同。

我的编译器是 x64 MSVC 14.35.32215

c++ pointers heap-memory stack-memory
2个回答
0
投票

如您所述,

int
int*
类型存储在堆栈中。引用是别名,因此可能不需要任何额外存储,具体取决于编译器实现。


0
投票

首先,变量的地址只是一个整数。 现在,看看你的第一个例子:

int a = 1;
int *b = new int{ 5 };
int &c = a;

a
在堆栈上,占用 4 个字节。字节以二进制格式表示值
1
,此reference可视化整数如何存储在内存中。

关于

b
,你是对的。
b
是一个指针,它在堆栈上有自己的地址,占用 4 个字节(或 8 个字节,具体取决于操作系统,请参见此处 https://learn.microsoft.com/en-us/cpp/cpp/raw-pointers ?视图=msvc-170)。这4个字节代表一个整数值,即
5
在堆上的地址(
new int{ 5 }
)。

关于

c
,它正是a的别名,C++可能需要内存来帮助程序的其他部分知道别名的存在。

从这里开始,希望你能自己回答你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.