2010-10-10 34 views
3

這裏是代碼片段指針在C,不明白他們是如何得到這樣的結果

void F (int a, int *b) 
{ 
a = 7 ; 
*b = a ; 
b = &a ; 
*b = 4 ; 
printf("%d, %d\n", a, *b) ; 
} 
int main() 
{ 
int m = 3, n = 5; 
F(m, &n) ; 
printf("%d, %d\n", m, n) ; 
return 0; 
} 

答案

4 4 
3 7 

我看到4 4是如何計算的,我不明白他們是如何得到3 7(我明白3是如何計算的,因爲沒有通過引用而沒有改變)

謝謝!

+2

澄清外,沒有什麼是通過參考這裏傳遞;第二個參數通過值傳遞給n的地址,這是該代碼故意誤導的關鍵。 – zem 2010-10-10 21:47:39

回答

4

截至main開始,我們有

m=3 n=5 // int m = 3, n = 5; 

則稱F(m, &n),按值傳遞m,並通過n指針 這樣

m = 3 n = 5 
a = 3 b->n // F(m, &n); 

現在,裏面F(),我們將7分配給a

m = 3 n = 5 
a = 7 b->n  // a = 7 

然後我們分配a(= 7),以通過b指向的存儲器地址( - > N)

m = 3 n = 7 
a = 7 b->n  // *b = a; 

我們改變b,以至於現在b指向a

m = 3 n = 7 
a = 7 b->a  // b = &a; 

然後我們分配4到b指向的內存地址( - > a)

m = 3 n = 7 
a = 4 b->a  // *b = 4; 

打印a(= 4)和*b( - > A = 4)

和打印m(= 3)和n(= 7)的函數

7

我詮釋了F功能與註釋來解釋這是怎麼回事:

a = 7 ; // a is now 7 
*b = a ; // b points to n, so n is now 7 
b = &a ; // b now points to a and no longer to n 
*b = 4 ; // a is now 4. n is unaffected 
1

在該行

b = &a ; 
*b = 4 ; 

B都密切關注得到了(它的內存地址的引用)。當你現在訪問* b時,它指向變量a的內存,而不是n了。

1

確實很微妙。 :)

F很多廢話發生:無論哪個值通過a傳遞,它被丟棄,而是7被分配給它。然後,a(即7)的值被分配給b指向的變量(即n,因此n變爲7)。

在下一行,對象到b點被改變,使得現在b指向本地參數a,並且在下面的行的目的是通過b(=>a)指出被設置爲4

因此,現在我們已經a即4,b指向a(=>所以*b==4,由於*b==a),m仍然是3(它是由值來傳遞,因此它可能不是由F改變)並且n被設置爲7.

順便說一句,這是正是你應該不所有在您的應用程序,以避免混淆誰擁有了恥辱的任何人對他們的工作的混亂。:)

+0

當然,整個功能是無意義的。但是這是你在學習書籍和教程中使用的典型代碼示例,以說明(在本例中)指針和引用是如何工作的 – Tseng 2010-10-10 21:41:38

+0

我知道,我只是指出這不是指針通常使用的方式,否則任何C程序都會一個難以理解的混亂(儘管有些人會認爲這是真的:S)。 – 2010-10-10 21:45:24

相關問題