指针和参考地址

时间:2017-04-01 21:22:30

标签: c++

任何人都可以解释我为什么& 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

3 个答案:

答案 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 - 序列是指未初始化的变量,这是未定义的行为。