2011-08-15 181 views
26

为什么90yq输出值?我只是做p=qq的价值是如何改变的?C++指针分配

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 

回答

78

我想与大家分享,我用来学习如何指针工作的时候,我开始了一个通用的技术。如果你将它应用到你的问题上,你会看到答案与白天一样平常。

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

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

现在,就目前而言,假设一个int是一个字节的大小。你是一个八位电脑。将您的int a写入其中一个框中。箱子下面的数字是它的地址。现在选择另一个框包含int *b = &aint *b也是某处存储在内存中的变量,它是一个包含&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

+8

一个非常优雅的答案。当我得知C/C++,我的朋友给我一个提示,拨打* P为“p的内容”,并成为后说的很清楚。 – lud0h

7

由于qy地址。在p=q之后,p也成为y的地址。这就是为什么pq打印,当您使用cout打印出来相同的地址。

换句话说,pq指向相同的变量y。所以,如果你改变任何y*p*q值,则改变将发生在所有的,因为所有的人都是一样的!

4

q没有改变,q仍然指向y。然而,p也指向y之后p = q,因此*p本质上是y,而*p = 90指定为y

请注意,cout << "Address of p = " << p << endl;是误导性的:p和地址p是两个不同的野兽。

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

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

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

2

执行'p = q;'后声明,这两个指针指向相同的变体'y'。所以当执行'* p = 90;'时,变量'y'的值被改变。

1

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

好的,改变* p意味着改变y。那么你将90分配给y * p = 90;

现在,你有这样的:

  • Y:90个
  • p指向为y
  • q点到y
  • * P:90
  • * Q:90
2
int x;int y;int *p = &x;int *q = &y;x = 35;y = 46; 

即p点s至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是相同的地址将输出相同的值。

4

那么让我们来看看它的每一步之后:

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

2

见anotations:

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