2014-01-27 83 views
0

所以我現在正在學習C語言中的指針,並且在我正在閱讀的書中有一個示例程序,但是當它運行時它不起作用。該代碼是:C指針(簡單程序)

#include <stdio.h> 
#include <stdlib.h> 
    void go_south_east(int *lat, int *lon) 
    { 
    *lat = *lat - 1; 
    *lon = *lon + 1; 
} 
int main(){ 
    int latitude = 64; 
    int lontitude = -32; 
    go_south_east(&latitude, &lontitude); 
    printf("Now at [%i, %i]\n", latitude, lontitude); 
    return 0; 
    system("pause"); 
} 

的想法是,這些「緯度和lontitude」是一個對象的座標,我們想把它移到南east.I個人認爲這是錯行:

go_south_east(&latitude, &lontitude); 

爲什麼我們需要變量的地址? 而關於這一行一個問題:

printf("Now at [%i, %i]\n", latitude, lontitude); 

是什麼%I這裏的意思是不是應該爲整數值%d?

+0

請參閱函數 –

+1

的簽名您能否詳細說明「運行時不能正常工作」。 ? '%d'和'%i'都是整數的格式說明符。 –

+0

程序'[6692] korab.c.exe'已退出,代碼爲0(0x0)。 - 這是我得到的消息 –

回答

0

有參數傳遞給函數的方式有三種:

  • 值傳遞
  • 路過指針
  • 引用傳遞

您的程序正在使用擦肩而過指針。

值傳遞是這樣的:

void go_south_east(int lat, int lon) 
{ 
    lat = lat - 1; 
    lon = lon + 1; 
} 

如果您改變了方案,把上面的代碼,你將看到的是printf()的輸出:「現在,在[64,-32]」。這是因爲您只通過了您的lat & lon的 - 實際上是它們的值的副本。該功能會更改副本的值,並且不會影響原件。

通過指針傳遞,您將存儲原始緯度值的內存地址傳遞給您的函數。該功能修改存儲在這些位置的數據。這就是main()中lat的當前值改變的原因。

+0

從您鏈接的頁面:「* C不支持通過引用[...] *」傳遞! – alk

2
go_south_east(&latitude, &lontitude); 

我們需要變量的地址,因爲您要通過引用傳遞它們,因爲您想要修改它們的值。你不想只給兩個數字的功能,你希望它能夠改變它們。所以你需要通知這些變量所在的函數(它們的地址),以便函數可以修改它們的值。

它正常工作,因爲輸出是Now at [63, -31],所以函數正確地紅色傳遞的值並更新它們。

+0

C中沒有「引用*參考*」。您傳入地址,指針。這些指針是按值傳遞的。然而措辭「*通過引用某些事物*」就可以。 – alk

+0

是的,嚴格來說你是對的。無論如何,即使不是100%正確的,通常也更容易說「通過參考」。從維基百科:「傳遞參考是通過顯式傳遞指針值在C中模擬。」 – fede1024