为什么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.