2013-07-05 104 views
3
int y=1; 
int k=2; 
int *p1; 
int *p2; 
p1=&y; 
p2=&k; 
p1=p2; 
*p1=3; 
*p2=4; 
printf("%d",y); 

我得到的輸出爲1,有人可以解釋我爲什麼!我期待它是4C中的指針分配

+1

**爲什麼**你是否期待?如果您不包含源代碼,我們無法調試您的大腦... –

+0

在* p1 = p2行的上方放置'* p1 = 2' *並查看它的作用 - 爲什麼輸出現在是2 ,但仍然不是4(或3)。 – Paul

回答

4

下面的註釋說明了這是如何工作:

int y=1; 
int k=2; 
int *p1; 
int *p2; 
p1=&y; //pointer p1 holds the address of y 
p2=&k; //pointer p2 holds the address of k 
p1=p2; //pointer p1 now holds the address which p2 holds, which is the address of k 
*p1=3; //the value which p1 points to is now 3 (so k equals 3 as well) 
*p2=4; //the value which p2 points to is now 4 (so k equals 4 as well) 
printf("%d",y); //y is still 1 

但是如果你沒有printf("%d",k);值4將被打印

+0

+1更好解釋:) – 0decimal0

1

當你這樣做:

p1=p2; 

你基本上是從P2複製變量k的地址爲P1。所以在這個步驟之後,兩個指針都指向變量k,所以如果你取消引用p1或p2,你實際上會改變變量k的值而不是y。

當你這樣做:

*p1 = 3; 

您assiging 3至變量k。然後當你這樣做時:

*p2 = 4; 

你正在給變量k再次分配4。這就是爲什麼y保持不變,當你打印它給你1.

0

當然,雖然我很想聽聽你是如何到達4. p1被賦予地址(即指向y),但後來2行被k的地址取代。因此,p1和p2都不指向y,所以y不會改變。

2

爲了保持這個簡單,我們假設&y=3&k=4

int y=1; 
int k=2; 
int *p1; 
int *p2; 
p1=&y; // p1=3 
p2=&k; // p2=4 
p1=p2; // p1=4 
*p1=3; // p1=4 so k becomes 3 
*p2=4; // p2=4 so k becomes 4 
printf("%d",y); // we get 1 because y was never changed 
1

聲明p1=p2;p1指向變量k。因此,無論以下分配:

*p1=3; 
*p2=4; 

隻影響變量k,所以y保持爲1