为什么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;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
35 90
90 90
Address of p = 0xbffa83c0
Address of q = 0xbffa83c0
Run Code Online (Sandbox Code Playgroud)
Cra*_*rks 106
我想分享一下我用来了解指针在我开始时如何工作的一般技巧.如果你将它应用到你的问题中,你会看到答案就像白天一样简单.
拿一张大方格纸,纵向放在你面前的桌子上.这是你电脑的记忆.每个框表示一个字节.选择一行,并将数字"100"放在最左边的框下方.这是内存的"最低地址".(我选择100作为非0的任意数字,您可以选择另一个.)从左到右按升序对数字进行编号.
+---+---+---+---+---+-- | | | | | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
现在,暂时假装int是一个字节大小.你是一台八位电脑.把你int a
写进其中一个盒子里.方框下面的数字是它的地址.现在选择另一个框来包含int *b = &a
.int *b
也是存储在内存中某处的变量,它是一个包含的指针,&a
发音为"a的地址".
int a = 5;
int *b = &a;
Run Code Online (Sandbox Code Playgroud)
a b +---+---+---+---+---+-- | 5 | |100| | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
现在,您可以使用此模型直观地处理您看到的值和指针的任何其他组合.这是一个简化(因为正如语言学者会说,指针不一定是地址,内存不一定是顺序的,并且有堆栈,堆和寄存器等等),但这是一个非常好的类比,99%计算机和微控制器.
所以在你的情况下,
int x = 35;
int y = 46;
Run Code Online (Sandbox Code Playgroud)
x y +---+---+---+---+---+-- | 35| 46| | | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
int *p = &x;
int *q = &y;
Run Code Online (Sandbox Code Playgroud)
x y p q +---+---+---+---+---+-- | 35| 46|100|101| | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
p = q;
Run Code Online (Sandbox Code Playgroud)
x y p q +---+---+---+---+---+-- | 35| 46|101|101| | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
*p = 90;
Run Code Online (Sandbox Code Playgroud)
x y p q +---+---+---+---+---+-- | 35| 90|101|101| | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
现在是什么*p
?什么是*q
?
因为q
是地址y
.之后p=q
,p也成为了地址y
.这就是为什么p
和q
当你打印出来使用打印相同的地址cout
.
换言之,既p
和q
指向相同的变量y
.所以,如果你改变任何一个的值y
,*p
或者*q
,那么所有的改变都会发生,因为它们都是一样的!
好吧,让我们在每一步之后看看它:
int x;
int y;
Run Code Online (Sandbox Code Playgroud)
现在我们有两个变量x
和y
:
int *p = &x;
int *q = &y;
Run Code Online (Sandbox Code Playgroud)
声明了另外两个变量,指向变量的指针p
,x
包含其地址和指向q
变量的指针,y
并包含其地址:
x = 35;
y = 46;
Run Code Online (Sandbox Code Playgroud)
在这里为变量赋值,这很明确:
p = q;
Run Code Online (Sandbox Code Playgroud)
现在,您将存储的地址分配q
给变量,p
以便两个变量都指向以下地址的q
地址y
:
*p = 90;
Run Code Online (Sandbox Code Playgroud)
在这里你取消引用p
,这是地址中的变量p
,它是y
和你赋值90
给变量y
.