任何人都可以解释我为什么& p的地址后,我分配的内存。
您无法获取尚未分配内存的对象的地址。指针在块作用域的开始处分配。因此,在分配之前,您从未观察到指针的地址 - 仅在之后。
在分配动态内存之前,您确实获取了指针的地址。分配动态内存后,您可以指定指针的值以获取动态内存的地址。赋值变量对变量的存储位置没有影响。预计将保持在同一地址。
为什么p还没有相同的地址为:& P'
您从未观察到&p
的地址。实际上,&p
是一个临时的,所以它没有地址。
<< &p
给出的值为&p
,即地址p
。 << p
为您提供了值p
,即第一次是不确定的值,第二次是动态分配的整数的地址。
也许你打算问“为什么p
不具有相同的值作为&p
”。这是因为p
不是指向自身,而是指向另一个对象。
此外,读取不确定的值具有未定义的行为。您的程序读取p
,并在为其分配值之前将其解除引用。因此你的程序的行为是不确定的。
参考地址
你的程序不使用的引用。
什么是参考呢?
引用是一种类似于指针的类型。它更简单,更受限制:它不能为空,它不能被重新分配,并且它的地址不能被占用。无论何时使用引用变量,它都是隐含的间接引用,与必须明确解除引用的指针不同。例如:
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
'p'是指针指向的地址,'&p'是存储指针的内存中的实际地址 – UnholySheep
'&p'不是引用,它是指向'p'的指针。 – melpomene
'&p'是一个'int **',不是一个引用,而'p'是一个'int *'。 “指针的地址与指针相同”magic [只发生在数组中](http://stackoverflow.com/questions/8412694/address-of-array)。 – dhke