[英]Two pointers to the same location?
我似乎在這里找不到答案,但是如果這是重復的,我感到抱歉。 這是我的問題:當我有兩個指向同一位置的指針時,然后我更改一個指針的地址(比方說指針A),是否會(偶然)更改另一個指針(指針B)的地址? 還是指針B的位置保持不變?
更改指針的內容(與指向對象相反)不會影響指向同一對象的其他指針。
指針B的位置將保持不變。
由於指針A和指針B是不同的指針,因此它們具有不同的內存地址。這意味着它們雖然彼此指向相同的內存地址,但它們彼此獨立。
但是,當您嘗試更改指針A的內容時,請務必小心,此操作可能會偶然導致指針B成為野生指針 !
您可以看到以下代碼的輸出:
#include <iostream>
int main(int argc, char **argv){
int a = 3, d = 4;
int *b = &a, *c = &a;
std::cout << b << ", " << c << std::endl;
b = &d;
std::cout << b << ", " << c << std::endl;
}
以下是代碼的輸出:
0x7ffca3788e40, 0x7ffca3788e40
0x7ffca3788e44, 0x7ffca3788e40
顯然,更改地址b
指向的地址與指針c
所指向的地址無關。
但是當您使用references
時,您可能會遇到類似現象。 引用是一個實體,是另一個對象的別名。 假設你有
int &ref = a;
ref = 5;
現在,更改變量ref
也將帶來變量a
的值更改,等於5。
指針將一條數據的存儲地址保存在內存中。
指針變量的值是該地址。
int targetA = 1;
int targetB = 2;
int *pointerA = &targetA;
int *pointerB = &targetA;
printf("%p, %p\n", pointerA, pointerB);
// => 0x7fff5c78e8f8, 0x7fff5c78e8f8
pointerB = &targetB;
printf("%p, %p\n", pointerA, pointerB);
// => 0x7fff5c78e8f8, 0x7fff5c78e8f4
通過為指針分配不同的地址/位置,您只需更改其指向的內容,其他變量就不會出錯。
讓我們看看這個代碼片段。
#include <iostream>
#include <string>
using namespace std;
int main ()
{
int * myp1, * myp2;
int myvalue;
myp1 = &myvalue;
myp2 = &myvalue;
myvalue = 10;
cout << "first address is " << myp1 << '\n';
cout << "second address is " << myp2 << '\n';
在這里,輸出是相同的(運行時,我得到的第一個地址是0x759ba27bb1d8,第二個地址是0x759ba27bb1d8)。
int myvalue2;
myp1 = &myvalue2;
myvalue2 = 20;
cout << "first address is " << myp1 << '\n';
cout << "second address is " << myp2 << '\n';
return 0;
在這里,地址是不同的,但是myp2指向與上面相同的地址。
這是有道理的; 您有兩個指向同一地址的獨立事物。 為什么改變一件事指向改變另一件事?
一個(可能非常糟糕的類比)是:假設您和世界另一端的某人都指向天空(例如,在天空的同一點)。 然后,您指向地面。 僅僅因為您指向地面,並不意味着另一個人會停止指向天空。
希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.