指针和引用地址

Pointer and reference address

本文关键字:地址 引用 指针      更新时间:2023-10-16

谁能解释为什么&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

谁能解释为什么 &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的地址。

p包含值的地址;当您重新分配时,该地址可能会更改。

*p取消引用地址并读取/写入值。

除了你的代码不正确;它可能会编译。

变量p保存指向整数的指针,即p的值是一个指针,当您分配p = new int时,该值会发生变化;

相反,&p表示p存储此指针值的内存地址。地址&p很可能在堆栈上,如果您将某些内容分配给p,则此地址不会更改。

进一步请注意,您的第一个cout序列引用了未初始化的变量,这是未定义的行为。