C ++指针赋值

时间:2011-08-15 08:15:42

标签: c++ pointers

为什么90yq的输出值?我只做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;
}

输出结果为:

35 90
90 90
Address of p = 0xbffa83c0
Address of q = 0xbffa83c0

10 个答案:

答案 0 :(得分:97)

我想分享一下我用来了解指针在我开始时如何工作的一般技巧。如果你将它应用到你的问题中,你会看到答案就像白天那样简单。

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

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

现在,暂时假装一个int是一个字节大小。你是一台八位电脑。将您的int a写入其中一个框中。方框下面的数字是它的地址。现在选择另一个包含int *b = &a的框。 int *b也是存储在内存中的变量,它是一个包含&a的指针,发音为“a的地址”。

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

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

所以在你的情况下,

int x = 35;
int y = 46;
  x   y 
+---+---+---+---+---+--
| 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

答案 1 :(得分:8)

因为qy的地址。在p=q之后,p也会成为y的地址。这就是pq使用cout打印时打印相同地址的原因。

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

q没有变化,q仍然指向y。但是,在p之后,y也指向p = q,因此*p基本上是y,而*p = 90会分配给y

请注意,cout << "Address of p = " << p << 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;
}

答案 4 :(得分:3)

请参阅注释:

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

答案 5 :(得分:2)

执行'p = q;'后声明,两个指针指向相同的变体'y'。因此,当执行'* p = 90;'时,变量'y'的值会发生变化。

答案 6 :(得分:2)

int x;int y;int *p = &x;int *q = &y;x = 35;y = 46;

I p指向x(35),q指向y(46)

p = q;

现在p指向y(46)

*p = 90;

现在p(又名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是相同的地址,将输出相同的值。

答案 7 :(得分:1)

设置p=q时,它们都引用相同的内存位置。因此,如果您更改p指向的值,它还会更改q指向的值,即y的地址。因此,y*p*q的输出相同。

答案 8 :(得分:1)

首先将p定义为指向x的指针。然后将q定义为指向y的指针。 然后,你写了p = q,所以现在,p和q都指向y。

好的,改变* p,意味着改变y。然后你用* p = 90;

这一行给y分配90

现在,你有这个:

  • y:90
  • p指向y
  • q指向y
  • * p:90
  • * q:90

答案 9 :(得分:0)

首先让我解释一下您的流程。在给x和y赋值之后,将x的引用放在* p中,将y的引用放在* q中。现在您的漏洞从这里开始,假设x的地址是abc,y是xyz,在您的示例上下文中,您将q分配给p意味着q的值是xyz现在p和q一旦将值90放在地址xyz上都指向xyz,所以它在q和p上都打印90