[英]Difference between pointer initializations
当我在阅读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
)解释在后台发生什么吗?
pd2
的值是分配给它的值,即dval
的地址,该地址存储为pd
值并分配给前者。
*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;
您只是按原样将一个指针值(一个数字)分配给另一个指针(数字)变量。
指针是一个内存地址。 double *pd2 = pd;
将一个指针分配给另一个指针。 没有魔术,只有一个简单的分配操作。 两个指针都指向相同的内存地址。
pd2
中的值与pd
值相同。 如果要取消引用pd
或pd2
,则将获得存储在dval
的值。
分配&pd
将需要一个指向指针的指针,因为您要获取指针的地址。
首先,您声明一个double dval
,然后声明一个指针,该指针指向该double(由于double由&dval
)。 然后将第二个指针设置为等于第一个指针。 所以最后,您有了:
pd = pd2 = &dval
这是两个指向相同地址的指针, 而不是指向另一个指针的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.