2014-02-11 79 views
-2

我似乎無法理解爲什麼這個代碼打印1作爲答案。 我正在學習C語言,這是作業的一個問題。 有人可以解釋一下嗎?我不明白這個代碼片段在C

#include <stdio.h> 
#include <stdlib.h> 
int main(void) { 
    int i,j; 
    int **p = (int **)malloc(2 * sizeof(int *)); 
    p[0] = (int *)malloc(2 * sizeof(int)); 
    p[1] = p[0]; 
    for(i = 0; i < 2; i++) 
      for(j = 0; j < 2; j++) 
        p[i][j] = i + j; 
    printf("%d",p[0][0]); 
    return 0; 
} 

在我看來應該打印0,但它似乎我錯了。

+2

*它會返回什麼? –

+8

請注意,'p [0]'和'p [1] [0]'是同一個對象,因爲'p [1]'指向與p [0]相同的地址。 –

+0

它返回值1. – cstoica

回答

2

你對這些指針感到困惑。 p[0]是指向int的指針,因此是p[1]

該代碼使得p[0]p[1]指向相同的地址:

p[1] = p[0]; 

這具有p[i][j]是指相同的對象i是否是0或1。嵌套的循環將在第一訪問p[0][0]效果的地方,將其設置爲0,但後來p[1][0](其在相同的對象p[0][0]被訪問,從而導致它在此處指定1.

的關鍵點是,p[0][0]p[1][0]是一樣的。

+0

非常感謝,現在一切都很清楚 – cstoica

0

p[0]p[1]都是int *類型(即指針)。

p[1] = p[0]; 

兩個p[1]p[0]後都指向同一個地址,這使得p[0][0]同樣以p[1][0]。該值由它最後一次更新決定。而p[1][0]更新該值在最後,這使得最終的結果是1

如果你改變你的代碼:

for(i = 1; i >= 0; i--) 
    for(j = 1; j >= 0; j--) 
     p[i][j] = i + j; 
printf("%d",p[1][0]); 

你猜怎麼着,它會打印0。希望它幫助。

+0

謝謝,我現在明白 – cstoica