为什么90
是y
和q
的输出值?我只做p=q
。为什么q
的价值会发生变化?
int main()
{
int x;
int y;
int *p = &x;
int *q = &y;
x = 35;
y = 46;
p = q;
*p = 90;
cout << x << " " << y << endl;
cout << *p << " " << *q << endl;
cout << "Address of p = " << p << endl;
cout << "Address of q = " << q << endl;
return 0;
}
输出结果为:
35 90
90 90
Address of p = 0xbffa83c0
Address of q = 0xbffa83c0
答案 0 :(得分:97)
我想分享一下我用来了解指针在我开始时如何工作的一般技巧。如果你将它应用到你的问题中,你会看到答案就像白天那样简单。
拿一张大方格纸,纵向放在你面前的桌子上。这是你电脑的记忆。每个框表示一个字节。选择一行,并将数字“100”放在最左边的框下方。这是内存的“最低地址”。 (我选择100作为非0的任意数字,您可以选择另一个。)从左到右按升序对数字进行编号。
+---+---+---+---+---+-- | | | | | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
现在,暂时假装一个int是一个字节大小。你是一台八位电脑。将您的int a
写入其中一个框中。方框下面的数字是它的地址。现在选择另一个包含int *b = &a
的框。 int *b
也是存储在内存中的变量,它是一个包含&a
的指针,发音为“a的地址”。
int a = 5;
int *b = &a;
a b +---+---+---+---+---+-- | 5 | |100| | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
现在,您可以使用此模型直观地处理您看到的值和指针的任何其他组合。这是一种简化(因为正如语言学者所说,指针不是必然一个地址,内存不是必然顺序,并且有堆栈和堆和寄存器等等,但对于99%的计算机和微控制器来说,这是一个相当不错的类比。
所以在你的情况下,
int x = 35;
int y = 46;
x y +---+---+---+---+---+-- | 35| 46| | | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
int *p = &x;
int *q = &y;
x y p q +---+---+---+---+---+-- | 35| 46|100|101| | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
p = q;
x y p q +---+---+---+---+---+-- | 35| 46|101|101| | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
*p = 90;
x y p q +---+---+---+---+---+-- | 35| 90|101|101| | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
现在什么是*p
?什么是*q
?
答案 1 :(得分:8)
因为q
是y
的地址。在p=q
之后,p也会成为y
的地址。这就是p
和q
使用cout
打印时打印相同地址的原因。
换句话说,p
和q
都指向同一个变量y
。因此,如果您更改y
,*p
或*q
中任何一个的值,那么所有内容都会发生变化,因为它们都是相同的!
答案 2 :(得分:5)
让我们在每一步之后看看它:
int x;
int y;
现在我们有两个变量x
和y
:
int *p = &x;
int *q = &y;
声明了另外两个变量,指针p
指向变量x
并包含其地址和指针q
,它指向变量y
并包含其地址:
x = 35;
y = 46;
这里为变量赋值,这很清楚:
p = q;
现在您将q
中存储的地址分配给变量p
,以便两个变量都指向q
地址y
的地址:
*p = 90;
在这里,您取消引用p
,这是p
中地址的变量,它是y
,您可以为变量90
分配值y
。
答案 3 :(得分:4)
q
的值没有变化,q
仍然指向y
。但是,在p
之后,y
也指向p = q
,因此*p
基本上是y
,而*p = 90
会分配给y
。
请注意,cout << "Address of p = " << p << endl;
具有误导性:p
和p
的地址是两种不同的野兽。
所以你的代码运行如下:
int main() {
int x;
int y;
int *p = &x; // now p points to x
int *q = &y; // now q points to y
x = 35;
y = 46;
p = q; // now p is the same as q, i.e., points to y
*p = 90; // p points to y, so *p is y.
// so we assign 90 to y
cout << x << " " << y << endl;
cout << *p << " " << *q << endl; // both *p and *q are y
cout << "Address of p = " << p << endl;
cout << "Address of q = " << q << endl;
return 0;
}
答案 4 :(得分:3)
请参阅注释:
int main()
{
int x;
int y;
int *p = &x;
int *q = &y;
x = 35;
y = 46;
p = q; // at this point p is now pointing to the same memory address
// as q, both of them are pointing to the memory allocated to y
*p = 90; // this will also change the values in *q and y
cout << x << " " << y << endl;
cout << *p << " " << *q << endl;
cout << "Address of p = " << p << endl;
cout << "Address of q = " << q << endl;
return 0;
}
答案 5 :(得分:2)
执行'p = q;'后声明,两个指针指向相同的变体'y'。因此,当执行'* p = 90;'时,变量'y'的值会发生变化。
答案 6 :(得分:2)
int x;int y;int *p = &x;int *q = &y;x = 35;y = 46;
I p指向x(35),q指向y(46)
p = q;
现在p指向y(46)
*p = 90;
现在p(又名y)的内容= 90
现在x = 35,y = 90,p和q指向y
cout << x << " " << y << endl;
打印x,y,即35和90
cout << *p << " " << *q << endl;
p和q指向相同的东西 - y - 其值为90因此90和90是输出
cout << "Address of p = " << p << endl;cout << "Address of q = " << q << endl;
由于p和q是相同的地址,将输出相同的值。
答案 7 :(得分:1)
设置p=q
时,它们都引用相同的内存位置。因此,如果您更改p
指向的值,它还会更改q
指向的值,即y
的地址。因此,y
,*p
和*q
的输出相同。
答案 8 :(得分:1)
首先将p定义为指向x的指针。然后将q定义为指向y的指针。 然后,你写了p = q,所以现在,p和q都指向y。
好的,改变* p,意味着改变y。然后你用* p = 90;
这一行给y分配90现在,你有这个:
答案 9 :(得分:0)
首先让我解释一下您的流程。在给x和y赋值之后,将x的引用放在* p中,将y的引用放在* q中。现在您的漏洞从这里开始,假设x的地址是abc,y是xyz,在您的示例上下文中,您将q分配给p意味着q的值是xyz现在p和q一旦将值90放在地址xyz上都指向xyz,所以它在q和p上都打印90