[英]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.