簡體   English   中英

兩個指向相同位置的指針?

[英]Two pointers to the same location?

我似乎在這里找不到答案,但是如果這是重復的,我感到抱歉。 這是我的問題:當我有兩個指向同一位置的指針時,然后我更改一個指針的地址(比方說指針A),是否會(偶然)更改另一個指針(指針B)的地址? 還是指針B的位置保持不變?

更改指針的內容(與指向對象相反)不會影響指向同一對象的其他指針。

指針B的位置將保持不變。

由於指針A和指針B是不同的指針,因此它們具有不同的內存地址。這意味着它們雖然彼此指向相同的內存地址,但它們彼此獨立。

但是,當您嘗試更改指針A的內容時,請務必小心,此操作可能會偶然導致指針B成為野生指針

圖片講一千個字。

圖片講一千個字

指針指向另一個存儲位置,同時,它們具有自己的存儲空間。

兩個指針A和B指向同一位置,但是它們被保存在單獨的存儲位置中。 (圖像的左半部分)

如果更改B,則僅更改B指向的內容,A保持不變。 (圖像的右半部分)

您可以看到以下代碼的輸出:

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM