我似乎无法在这里找到答案,但如果这是重复的话,我很抱歉。这是我的问题:当我有两个指向同一位置的指针时,我改变一个地址(比如指针A),我(偶然)会改变另一个指针(指针B)的地址吗?或指针B的位置保持不变?
答案 0 :(得分:5)
更改指针的内容(与指向的对象相反)不会影响指向同一对象的其他指针。
答案 1 :(得分:2)
指针B的位置将保持不变。
因为指针A和指针B是不同的指针,它们具有不同的存储器地址。这意味着它们彼此独立,尽管它们都指向相同的存储器地址。
但是当你试图改变指针A的内容时你应该小心,这个操作可能会导致指针B意外地成为狂野指针!
答案 2 :(得分:2)
图片说千言万语。
指针指向另一个内存位置,同时它们有自己的内存空间。
两个指针,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指向的地址与上面相同。
这是有道理的;你有两个单独的东西指向同一个地址。为什么要改变一件事指向改变另一件事?
(可能非常糟糕的比喻)是:考虑到你和世界另一端的某个人正指向天空(比如天空中的同一点)。然后,你指着地面。只是因为你指着地面,并不意味着另一个人会停止指向天空。
希望有所帮助。