C++指针赋值

Fus*_*ate 30 c++ pointers

为什么90输出值yq?我只是这样做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

  • 一个非常优雅的答案.当我学习C/C++时,我的朋友给了我一个提示,将*p称为"p的内容",之后变得非常清楚. (12认同)
  • 只是为了确认一下,是“*p == 90”和“*q == 90”吗? (2认同)
  • @BenR 是的。p == q 所以 *p == *q。 (2认同)

Naw*_*waz 8

因为q是地址y.之后p=q,p也成为了地址y.这就是为什么pq当你打印出来使用打印相同的地址cout.

换言之,既pq指向相同的变量y.所以,如果你改变任何一个的值y,*p或者*q,那么所有的改变都会发生,因为它们都是一样的!


Gai*_*aim 5

好吧,让我们在每一步之后看看它:

int x;
int y;
Run Code Online (Sandbox Code Playgroud)

现在我们有两个变量xy:

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.