2017-04-01 147 views
-1

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

'p'是指针指向的地址,'&p'是存储指针的内存中的实际地址 – UnholySheep

+0

'&p'不是引用,它是指向'p'的指针。 – melpomene

+0

'&p'是一个'int **',不是一个引用,而'p'是一个'int *'。 “指针的地址与指针相同”magic [只发生在数组中](http://stackoverflow.com/questions/8412694/address-of-array)。 – dhke

回答

1

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

那么什么是参考?我想清楚地知道...我有点困惑... – Marius

+0

@Marius看到编辑 – user2079303

0

&p包含p地址。

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

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

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

0

变量p包含一个指向整数的指针,即p的值是一个指针,当你指定p = new int时该值会改变;

&p,相反,意味着存储该指针值的存储器地址p。地址&p最有可能位于堆栈上,并且如果您将某些内容分配给p,则此地址不会更改。

还请注意,您的第一个cout-序列是指未初始化的变量,这是未定义的行为。