【问题标题】:C++ pointer assignmentC++ 指针赋值
【发布时间】:2011-10-27 03:09:18
【问题描述】:

为什么90yq的输出值?我只是做p=qq的值怎么变了?

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

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    我想分享一个通用技术,当我开始学习指针的工作原理时,我使用该技术。如果你把它应用到你的问题上,你会看到答案一清二楚。

    拿一张大方格纸,将它纵向放在你面前的桌子上。这是您计算机的内存。每个框代表一个字节。选择一行,然后将数字“100”放在最左边的方框下方。这是内存的“最低地址”。 (我选择了 100 作为非 0 的任意数字,您可以选择另一个。)从左到右按升序对框进行编号。

    +---+---+---+---+---+-- | | | | | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...

    现在,暂时假设一个 int 的大小是一个字节。你是一台八位计算机。将您的int a 写入其中一个框中。方框下方的数字是它的地址。现在选择另一个框来包含int *b = &amp;aint *b也是存储在内存某处的变量,它是一个包含&amp;a的指针,读作“a的地址”。

    int  a = 5;
    int *b = &a;
    
    一个 +---+---+---+---+---+-- | 5 | |100| | | ... +---+---+---+---+---+-- 100 101 102 103 104 ...

    现在您可以使用此模型直观地处理您看到的任何其他值和指针组合。这是一种简化(因为正如语言学究所说,指针不是必要地址,内存也不是必要连续的,并且有堆栈、堆和寄存器等等),但对于 99% 的计算机和微控制器来说,这是一个很好的类比。

    所以在你的情况下,

    int x = 35;
    int y = 46;
    
    xy +---+---+---+---+---+-- | 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 是什么?

    【讨论】:

    • 一个非常优雅的答案。学C/C++的时候,朋友给了我一个提示,叫*p为“p的内容”,之后就很清楚了。
    • 只是为了确认一下,是*p == 90*q == 90?
    • @BenR 是的。 p == q 所以 *p == *q.
    【解决方案2】:

    因为qy的地址。而在p=q之后,p也变成了y的地址。这就是为什么pq 在使用cout 打印它们时会打印相同的地址。

    换句话说,pq 都指向同一个变量y。所以如果你改变了y*p*q中的任何一个的值,那么所有的变化都会发生,因为它们都是一样的!

    【讨论】:

      【解决方案3】:

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

      int x;
      int y;
      

      现在我们有两个变量xy

      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

      【讨论】:

        【解决方案4】:

        q 没有改变,q 仍然指向y。然而,pp = q 之后也指向y,所以*p 本质上是y,而*p = 90 分配给y

        注意cout &lt;&lt; "Address of p = " &lt;&lt; p &lt;&lt; endl; 具有误导性:pp 的地址是两种不同的野兽。

        所以你的代码是这样运行的:

        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;
        }
        

        【讨论】:

          【解决方案5】:

          见注释:

          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;
          }
          

          【讨论】:

            【解决方案6】:

            在执行'p = q;'之后语句,这两个指针指向同一个变体'y'。所以当执行 '*p = 90;' 时,变量 'y' 的值会改变。

            【讨论】:

              【解决方案7】:
              int x;int y;int *p = &x;int *q = &y;x = 35;y = 46;
              

              I.e p 指向 x (35) 和 q 指向 y (46)

              p = q;
              

              现在 p 指向 y (46)

              *p = 90;
              

              现在 p (aka 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 是同一个地址,所以会输出相同的值。

              【讨论】:

                【解决方案8】:

                当您设置p=q 时,它们都引用相同的内存位置。因此,如果你改变p指向的值,也会改变q指向的值,也就是y的地址。所以y*p*q的输出是一样的。

                【讨论】:

                  【解决方案9】:

                  您首先将 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

                  【讨论】:

                    【解决方案10】:

                    首先让我解释一下你的流程。将 x 的引用放在 *p 中,将 y 的引用放在 *q 中,然后为 x 和 y 赋值。现在你的缺陷从这里开始,假设 x 的地址是 abc,y 是 xyz,在你的示例上下文中,你将 q 分配给 p 表示 q 的值现在是 xyz,p 和 q 都指向 xyz,只要你将值 90 放在地址 xyz 上,所以它在 q 和 p 上都打印 90

                    【讨论】:

                      【解决方案11】:
                      int main() 
                      {
                      
                          int x;
                          int y;
                          int *p = &x;//this p pointer stores address of variable x
                          int *q = &y;//this q pointer stores address of variable y
                      
                          x = 35;//assigned value 35 to x
                          y = 46;//assigned value 46 to y
                      
                          p = q;//this line make pointer p to store address which is their in q that is address of y
                      
                          *p = 90;//this line will change the value of y because by previous we change the pointer p address before line p=q p was pointing to x but now it is pointing to y
                      
                          cout << x << " " << y << endl;
                          cout << *p << " " << *q << endl;as we make pointers p and q pointing to same variable that is y and change the value of y to 90 by doing*p=90 output for both *p & *q is 90
                          cout << "Address of p = " << p << endl;
                          cout << "Address of q = " << q << endl;
                      
                          return 0;
                      }
                      

                      【讨论】:

                      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。仅仅在代码中添加 cmets 是不够的。
                      • 欢迎来到 SO,在发布答案之前请阅读this
                      猜你喜欢
                      • 2013-05-15
                      • 2017-08-20
                      • 2010-09-11
                      • 2019-07-10
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-07-06
                      • 2011-01-20
                      相关资源
                      最近更新 更多