2011-08-15 187 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; 
}