指针初始化之间的差异

时间:2015-12-07 23:46:27

标签: c++ pointers

在我阅读C ++ Primer时,发现这个我不理解的例子

double dval;
double *pd = &dval; //ok:initializer is the address of a double
double *pd2 = pd; // ok:initializer is a pointer to double

不应该*pd2是指向指针的指针,因为*pd也是指针吗?有人可以解释后台发生的内存地址(分配给pd2的内容)吗?

4 个答案:

答案 0 :(得分:1)

pd2的值是分配给它的内容,即dval的地址,该地址存储为pd的值并分配给前者。

答案 1 :(得分:1)

  

不应该*pd2是指向指针,因为*pd是指针吗?

没有。 pd2被分配了pd当前持有的值。因此pd2最终指向dval。如果您希望pd2指向pd本身,而不是pd指向的内容,则只能使用指向指针的指针,例如:

double dval;
double *pd = &dval;
double **pd2 = &pd;
  

有人可以通过内存地址(分配给pd2的内容​​)解释后台会发生什么吗?

指针只是一个恰好是内存地址的数字。如果您将指针视为整数,则您提供的代码与幕后的代码差别不大:

double dval;
uintptr_t pd = address of dval;
uintptr_t pd2 = pd;

您只是将一个指针值(数字)原样指定给另一个指针(数字)变量。

答案 2 :(得分:1)

指针是内存地址。 double *pd2 = pd;为另一个指针指定一个指针。没有魔法,只是一个简单的赋值操作。两个指针都指向相同的内存地址。

pd2中的值与pd中的值相同。如果您要取消引用pdpd2,您将获得存储在dval中的值。

分配&pd需要一个指向指针的指针,因为你正在获取指针的地址。

答案 3 :(得分:0)

首先声明一个双dval,然后声明一个指向该双精度的指针(因为它由双精度地址&dval设置)。 然后将第二个指针设置为等于第一个指针。 最后,你有:

pd = pd2 = &dval

这是两个指针,指向相同的地址,指向另一个指针的指针。