C++ C++;指针赋值
为什么C++ C++;指针赋值,c++,pointers,C++,Pointers,为什么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 <<
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;
}
因为
q
是y
的地址。在p=q
之后,p也成为y
的地址。这就是为什么p
和q
使用cout
打印时打印相同的地址
换句话说,p
和q
都指向相同的变量y
。因此,如果您更改y
、*p
或*q
中任何一个的值,那么所有这些值都将发生更改,因为它们都是相同的 q的值没有改变,q
仍然指向y
。然而,p
在p=q
之后也指向y
,因此*p
本质上是y
,并且*p=90
分配给y
请注意,
cout我想与大家分享一个我刚开始学习指针如何工作时使用的通用技术。如果你把它应用到你的问题上,你会发现答案一目了然
拿一大张图表纸,纵向地放在你面前的桌子上。这是你电脑的内存。每个框代表一个字节。选择一行,并将数字“100”放在最左侧框的下方。这是内存的“最低地址”。(我选择100作为不是0的任意数字,您可以选择另一个。)按从左到右的升序为方框编号
+---+---+---+---+---+--
| | | | | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
x y p q
+---+---+---+---+---+--
| 35| 90|101|101| | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
现在什么是*p
?什么是*q
设置p=q
时,它们都引用相同的内存位置。因此,如果您更改p
指向的值,它也将更改q
指向的值,即y
的地址。因此,y
、*p
和*q
的输出是相同的。在执行'p=q;'语句,两个指针指向同一个变量“y”。所以当执行“*p=90;”时,变量“y”的值已更改。首先将p定义为指向x的指针。然后将q定义为指向y的指针。
然后,你写了p=q,现在,p和q都指向y
改变*p意味着改变y。然后通过行*p=90将90赋值给y
现在,你有了这个:
- y:90
- p指向y
- q指向y
- *p:90
- *q:90
即p点到x(35)和q点到y(46)
现在p指向y(46)
现在p(aka y)=90的内容
现在x=35,y=90,p和q指向y
cout << x << " " << y << endl;
cout好的,让我们在每一步之后看看它:
int x;
int y;
现在我们有两个变量x
和y
:
int *p = &x;
int *q = &y;
*p = 90;
还有另外两个变量,指针p
,指向变量x
并包含其地址;指针q
指向变量y
并包含其地址:
x = 35;
y = 46;
在这里,您可以为变量赋值,这一点很清楚:
p = q;
现在您将存储在q
中的地址分配给变量p
,因此这两个变量都指向q
中的地址y
的地址是什么:
int *p = &x;
int *q = &y;
*p = 90;
在这里,您取消引用p
,这是p
中地址上的变量,它是y
,并将值90
分配给变量y请参见说明:
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;
}
intmain()
{
int x;
int-y;
int*p=&x;
int*q=&y;
x=35;
y=46;
p=q;//此时p指向同一内存地址
//作为q,它们都指向分配给y的内存
*p=90;//这也会改变*q和y中的值
首先让我解释一下你的流程。你把x的引用放在*p中,然后把y的引用放在*q中,然后你把值都赋给x和y。现在你的缺陷从这里开始,假设x的地址是abc,y是xyz,在你的示例上下文中,你把q赋给p意味着q的值是xyz,现在p和q都指向xyz,只要你把值90赋给address xyz所以它在q和p上都打印了90,这是一个非常优雅的答案。当我学习C/C++时,我的朋友给了我一个提示,让我把*p称为“p的内容”,这之后就变得非常清楚了。只是为了确认一下,*p==90
和*q==90
?@BenR是的。p==q so*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 ...
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;
int x;
int y;
int *p = &x;
int *q = &y;
x = 35;
y = 46;
p = q;
*p = 90;
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;
}