2012-10-18 121 views
0

我發現下面的代碼在我的課本:如何打印指針的指向值?

#include<stdio.h> 

void disp(int *k) 
{ 
printf("%d",*k); 
} 

int main() 
{ 
int i ; 
int marks[ ] = { 55, 65, 75, 56, 78, 78, 90 } ; 
for (i = 0 ; i <= 6 ; i++) 
disp (&marks[i]) ; 
return 0; 
} 

} 

代碼工作得很好,但我有一個關於邏輯疑惑:

  1. 我送的數組變量的地址。但在disp函數中,我使用一個指針變量作爲參數並打印指針的值。所以從main函數發送的參數類型應與disp的參數不匹配。那麼它是怎樣工作的?

  2. 我試圖通過改變disp功能

    void disp(int (&k)) 
    { 
    printf("%d",*k); 
    } 
    

    做相同的,但我得到一個錯誤。我應該怎樣做才能通過以地址爲參數進行工作,即void disp(int &k)

回答

3

當你這樣做: -

int *k = &marks[i]; 

上面的語句被分成: -

int *k; -> Integer Pointer 
k = &marks[i]; --> `k` points to the address of marks[i] 

所以,基本上,k是一個integer指針,它指向當前的地址元素在你的array

因此,當您打印*k時,它相當於: - *(&marks[i]),它取消參考值並打印元素marks[i]

那麼,在下面的代碼,你可以理解,pointer分配和de-referencing的整個過程是如何發生的: -

int *k; // Declaring integer pointer. 

// Actually 'k' is equal to the `&marks[i]`. 
// '*k' is just the indication of it being a pointer 
k = &marks[i];  

// Dereference pointer 
*k = *(&marks[i]); --> = marks[i] 

printf("%d",*k); --> printf("%d",marks[i]); 

此外,因爲你不能聲明變量,如: -

int &k = &marks[i]; 

您不能將它們作爲您的功能中的參數: -

void disp(int &k); 

因爲最終傳遞的array element的地址存儲在這個變量中。所以,它必須是int *k

5

1)我送的陣列的變量的地址。但是在disp函數中,我使用一個指針變量作爲參數並且打印指針的值。

瞭解指針是地址。所以&marks[i]int*。而您不打印指針的值,而是指向它的值。

printf("%d",*k); 

*k取消引用指針並給出指向的值。

void disp(int (&k)) 

在C中的語法無效,&k不是有效的標識符。

0

閱讀指針和地址變量。以及它們如何使用。 當函數期望指針時,您必須發送指針或變量的地址。由於指針保存地址。

您面臨的第二個問題是語法錯誤。因爲沒有可應用於「左值」的運算符&。

0

嗯,簡單地說,我可以說你正在傳遞一個地址在函數中,並將其接收到一個指針中..它正確的指針可以指向或保存地址。或者其他方式,只要您發送地址,但將其存儲在參考變量中,但是參考誰是問題。嘗試反之亦然,你會更好地理解結構...

1

1)您理解在for循環中地址發送到disp是正確的。但disp接收指針作爲參數......這只是一個地址。在該函數內部,您不會打印指針的「值」。您打印該指針指向的值(該地址上的值)。在printf調用「* k」中,取消引用指針 - 獲取該指針指向的值。

2)您沒有更改該功能,以便它接收地址。你改變它,以便它收到參考。你也可以說它收到一個隱藏的指針 - 它和指針一樣,但你不需要用「* k」來解引用它 - 你用它作爲一個普通變量