2014-04-15 233 views
7

指針對我來說是一件新事物,我很難理解它,但我不會屈服,並希望能夠學習它。scanf(「%d」,* p)和scanf(「%d」,p)有什麼區別?

scanf ("%d", *p)scanf ("%d", p)之間的區別是什麼?

在例子中,我看到如果我想在變量中輸入一些值,我應該使用scanf ("%d", p)。這對我來說沒有意義。它不應該是scanf ("%d", *p)

我把它解釋爲:「把指針指向的某個整數值」,例如它指向變量x,然後它應該是x = 10,但它不是。那麼如何使用scanf()和指針來設置數組中的值呢?

我在哪裏發生了什麼問題?我試圖用C語言來學習,因爲它是我應該在我的課堂上使用的。

例如:

#include <stdio.h> 
int main() { 
    float x[10], *p; 
    int i; 
    p = &x[0]; 
    for (i = 0; i < 10; i++) { 
     scanf("%d", p + i); 
    } 
    for (i = 0; i < 10; i++) { 
     printf("%d", *(p + i)); 
    } 
    return 0; 
} 

爲什麼只在第二循環的第一for() {}*(p + i)p + i?我會把*(p + i)也放在第一個for() {}*(p + i)對我來說就像是:「第(p + i)個元素是什麼,並使它等於某個值」。

+1

也許你應該添加類型... – Deduplicator

+0

什麼是'p'?如果'p'不是指針,則應該使用'scanf(「%d」,&p)' – slugonamission

+0

順便說一句:在使用希望讀取的內容之前檢查'scanf()'的返回值。 'scanf(「%d」,p + i)!= 1)Oops();' – chux

回答

18

*p手段去的地方p
&p手段採取的p地址,或「獲得一個指向」 p

int i; 
scanf("%d", &i); // gives scanf a pointer to i 

int i; 
int *p = &i; 
scanf("%d", p); // a more contrived way to say the same thing 

強制性的視覺解釋是Pointer Fun with Binky

可以讀取從右側的類型到左:

int *p => 「p具有類型int *」=>p是一個指向int
int *p => 「*p已鍵入int」=>*pint指向p

1

如果p是可變的(比如說,一個int),你可以使用& p將其指針傳遞給scanf。單獨不是一個指針,* p會使問題複雜化。

12

一個是對的,另一個是錯的。 (或兩者可能是錯的,這取決於p是。)

如果你打電話

scanf("%d", SOMETHING); 

然後SOMETHING必須是一個指向int

如果你有一個int對象,使用一元&獲取其地址(即指向對象):

int n; 
scanf("%d", &n); 

如果p恰好是一個int*,那麼你可以使用它的值:

int *p; 
scanf("%d", p); 

但在這裏我沒有指定了價值p,所以這個編譯但未定義的行爲。這是確定:

int n; 
int *p = &n; 
scanf("%d", p); 

至於使用*p,這將是唯一的,如果p是一個指針的指針有效到int

int n; 
int *p0 = &n; 
int **p = &p0; 
scanf("%d", *p); 

但它很少會是有意義的做到這一點。絕大多數時候,論點將只是一些int對象的地址,如&n

如果n是一個int,那麼只是通過nscanf沒有任何意義。您只需要通過n的當前即可。關鍵是你想允許scanfn中存儲一個新值,要做到這一點,scanf需要的地址爲n

2

函數調用C按值傳遞參數,而不是引用。這意味着當您使用參數調用一個函數時,函數會收到參數副本,並且該函數不能直接修改來自調用點的原始參數。那就是:

int x = 42; 
foo(x); 
printf("%d\n", x); 

foo不能改變的變量x,代碼將始終打印42

但有很多情況下函數可能需要修改調用者的參數。 scanf就是這樣一種情況。爲了實現這一點,這些功能需要使用間接級別。調用者不是將變量直接傳遞給函數,而是將指針傳遞給該變量。然後該函數接收指針的副本,並通過取消引用,可以訪問並修改它指向的變量。

我建議花一些時間閱讀comp.lang.c常見問題解答。本主題討論:

相關問題