在我阅读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
的内容)吗?
答案 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
中的值相同。如果您要取消引用pd
或pd2
,您将获得存储在dval
中的值。
分配&pd
需要一个指向指针的指针,因为你正在获取指针的地址。
答案 3 :(得分:0)
首先声明一个双dval
,然后声明一个指向该双精度的指针(因为它由双精度地址&dval
设置)。
然后将第二个指针设置为等于第一个指针。
最后,你有:
pd = pd2 = &dval
这是两个指针,指向相同的地址,不指向另一个指针的指针。