指向同一位置的两个指针?

时间:2017-02-08 01:30:52

标签: c++ c pointers

我似乎无法在这里找到答案,但如果这是重复的话,我很抱歉。这是我的问题:当我有两个指向同一位置的指针时,我改变一个地址(比如指针A),我(偶然)会改变另一个指针(指针B)的地址吗?或指针B的位置保持不变?

6 个答案:

答案 0 :(得分:5)

更改指针的内容(与指向的对象相反)不会影响指向同一对象的其他指针。

答案 1 :(得分:2)

指针B的位置将保持不变。

因为指针A和指针B是不同的指针,它们具有不同的存储器地址。这意味着它们彼此独立,尽管它们都指向相同的存储器地址。

但是当你试图改变指针A的内容时你应该小心,这个操作可能会导致指针B意外地成为狂野指针

答案 2 :(得分:2)

图片说千言万语。

picture speaks a thousand word

指针指向另一个内存位置,同时它们有自己的内存空间。

两个指针,A和B指向同一个地方,然而,它们保存在不同的内存位置。 (图像的左半部分)

如果更改B,则只会更改B指向的内容,A保持不变。 (图像的右半部分)

答案 3 :(得分:1)

您可以看到以下代码的输出:

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

答案 4 :(得分:1)

指针保存内存中一段数据的内存地址。

指针变量的值是这个地址。

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

通过为指针指定不同的地址/位置,您只需更改其指向的位置,其他变量不会受到影响。

答案 5 :(得分:0)

让我们来看看这段代码。

#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指向的地址与上面相同。

这是有道理的;你有两个单独的东西指向同一个地址。为什么要改变一件事指向改变另一件事?

(可能非常糟糕的比喻)是:考虑到你和世界另一端的某个人正指向天空(比如天空中的同一点)。然后,你指着地面。只是因为你指着地面,并不意味着另一个人会停止指向天空。

希望有所帮助。