真的很愚蠢的問題,但我很困惑。
所以,我的理解是,如果你有:
int i(3);
int& j(i);
int* k(&i);
在這種情況下,如果 的值發生j變化,那么 的值i也會發生變化,因為j基本上是i? 在另一方面,如果我們做k點別的東西,然后的價值i和j將不會發生任何變化,對不對?
如果上述情況屬實,那么如果我們有:
a = 1; b = 2;
p = &a; q = &b;
*p = *q;
那為什么值a變成了2呢?我以為p只是指向其他東西,而不會修改a?
uj5u.com熱心網友回復:
猜想1是正確的。
只要k是在指向i(并順便int* k(&j);也將指向k在i因為jIS i)*k=10;將設定i到10。如果你指向k其他地方,那么*k=10;它現在指向的任何東西都會改變。
但是在第二部分中,p指向 from 的任何內容都不會發生變化a,因此寫入 to*p會發生變化a。q完全分離開來p,這樣指著q在b簡單的手段q在點b和*p = *q;有效的a=b變化情形之一的這些指標點,你會得到不同的結果。
uj5u.com熱心網友回復:
在您的第一個示例中,i是一個變數,具有許多屬性 - 其中兩個是記憶體中的地址和名稱 ( i)。 j是 的別名i,因此只是與 相同記憶體位置的替代名稱i。或者,換句話說,底層記憶體位置有兩個名稱——一個是i,另一個是j。
影響底層的記憶體的任何操作同時改變兩者的數值i和j。因此分配給i影響(通過記憶體位置)的值j,反之亦然。例如,i = 42將通過更改底層記憶體位置的內容來作業,并且由于j是同一記憶體位置的替代名稱,將導致條件j == 42為真,反之亦然。
k是一個變數,它包含的地址i(即底層記憶體位置的地址)。分配到*k會影響記憶體位置,因此會發生變化i,因此j. 例如,*k = 21將導致i == 21 && j == 21為真。
指標和參考之間的一個主要區別是指標可以重新分配(因此它包含不同記憶體位置的地址)但參考不能。因此不可能關聯i或j與不同的記憶體位置相關聯。而分配k = &some_other_int將導致k包含地址some_other_int- 并且k不再與i或有任何關聯j。使用 with 執行任何操作*k都會影響具有名稱的記憶體位置some_other_int,但不會影響與i或關聯的值j。
在您的第二個示例中, 的值p是 的地址,a的值q是 的地址b。但是,該運算式的 *p = *q作業原理是提取 指向的記憶體位置處的值q(即 的值b)并將其分配到 指向的記憶體位置p(名稱為a)。因此,*p = *q具有相同的凈效果*p = b或者a = b甚至是a = *b。從這個意義上說,*pand*q可以被視為分別對(或替代名稱或別名)a和的參考b。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349710.html
上一篇:拋出例外:讀取訪問沖突。**這是0xCCCCCCCC
下一篇:向量迭代器行為不正常
