任何人都可以解释我为什么& p在分配内存后具有相同的地址。 为什么p与地址不同:& p?
#include <iostream>
using namespace std;
int main()
{
int *p;
cout << "p value: " << *p << " p adress: " << p << " &p reference: " << &p;
p = new int;
*p = 5;
cout << endl;
cout << "p value: " << *p << " p adress: " << p << " &p reference: " << &p;
return 0;
}
编译后:
p value: -462058557 p adress: 0x74af73da &p reference: 0x6fff0c
p value: 5 p adress: 0x1d2978 &p reference: 0x6fff0c
答案 0 :(得分:1)
任何人都可以解释我为什么&amp; p在我分配内存后拥有相同的地址。
您无法获取尚未分配内存的对象的地址。指针在块作用域的开头分配。因此,在分配之前,您从未观察过指针的地址 - 仅在。
之后在分配动态内存之前,确实会获取指针的地址。分配动态内存后,将指针的值指定为具有动态内存的地址。分配变量的值不会影响存储变量的位置。预计它将保留在同一地址。
为什么p的地址不同于:&amp; p?
您永远不会看到&p
的地址。事实上,&p
是临时的,所以它没有地址。
<< &p
为您提供&p
的值,即p
的地址。 << p
为您提供p
的值,即第一次出现的不确定值,以及第二次出现的动态分配整数的地址。
也许您打算问“为什么p
与&p
”没有相同的值。这只是因为p
不指向自身,而是指向另一个对象。
此外,读取不确定的值具有未定义的行为。您的程序会读取p
,并在为其指定值之前解除引用。因此,程序的行为是未定义的。
参考地址
您的程序不使用任何引用。
那么什么是参考?
Reference是一种类似于指针的类型。它更简单,更受限制:它不能为空,不能重新分配,也不能取其地址。每当使用引用变量时,它都是隐式的,但与必须明确解除引用的指针不同。例如:
int i; // non reference, non pointer
int* p = &i; // a pointer
int& r = i; // a reference
p = nullptr; // a pointer can be null (doesn't point to anything)
// and it can be reassigned
//r = nullptr; // a reference can not. This is ill-formed
r = 42; // a reference is implicitly indirected
*p = 42; // a pointer must be dereferenced explicitly
// to acces the pointed object
int** pp = &p; // you can take the address of a pointer
//int*& pr = &r; // you cannot take the address of a reference
p = &r; // if you apply address-of operator on a reference,
// it is indirected implicitly
答案 1 :(得分:0)
&p
包含p
的地址。
p
包含值的地址;当你重新分配时,这可能会改变。
*p
取消引用地址并读取/写入值。
除了你的代码不正确;它可能会编译。
答案 2 :(得分:0)
变量p
包含指向整数的指针,即p
的值是指针,当您指定p = new int
时,此值会更改;
&p
表示p
存储此指针值的内存地址。地址&p
最有可能位于堆栈中,如果您将某些内容分配给p
,则此地址不会更改。
进一步注意,您的第一个cout
- 序列是指未初始化的变量,这是未定义的行为。