2011-05-27 71 views
2

這裏,我提供了一個使用指針的簡單代碼。* C指針中的符號

void rets(int *px, int *py) 
{ 
    *px = 3; 
    *py = 5; 
} 
int main() 
{ 
    int x, y; 

    rets(&x, &y); 
    printf("First is %d, second is %d", x, y); 
} 

我只是希望它被清除......在宣言:int *px, *py;,留出要存儲一個整型變量的地址兩個字節,並給出該存儲空間的名稱PX。它還留出另外兩個字節來存儲另一個整數變量的地址,並給這個空間起名字py。星號告訴這些變量將包含地址編譯器(如果我沒有記錯?),以及INT告訴它的地址將指向整數變量。但是 - 這裏存在許多混亂的根源:

*px = 3; 
*py = 5; 

它是在一個稍微不同的方式使用這裏比在指針聲明。這是什麼意思?

+0

@保羅ř你什麼意思? – aer 2011-05-27 07:18:51

+0

爲什麼要結束投票?這是一個完全合理的問題。 – 2011-05-28 06:58:45

回答

3

所以在函數聲明中,你聲明瞭將作爲參數傳遞給int的指針。在定義中你是取消引用這樣的指針實際上使用了在main中聲明的變量空間。如果你沒有取消引用,你只會改變指針而不是指向的內容。在你調用rets()的地方,你給出了使用&在main中定義的變量的地址。

+0

在'main()'中放置'void'有什麼好處? – aer 2011-05-27 07:48:07

+2

無,應該是int和argc和argv的幾個參數。這只是一個澄清問題的快速編輯。 – ColWhi 2011-05-27 07:49:47

2
*px = 3; 
*py = 5; 

這意味着,你給的值3通過指針指向px內存,你給的值5通過指針指向py內存。

+0

所以你的意思是:函數有*間接*將值3和5傳遞給變量** x **和** y **? – aer 2011-05-27 07:52:13

+0

@aerohn你已經給函數指定了x和y的地址,這允許函數通過訪問地址(解引用)來改變x和y的值。在C中,函數獲取參數的副本。所以你想要一個函數來改變你給它的變量指向那個變量的指針。 – 2011-05-28 07:30:36

0

基本上, '*' 在3種不同的方式使用在C(除非我錯過了什麼),這取決於上下文

  1. 乘法
  2. 聲明指針變量
  3. 解除引用

讓我們忽略#1。

當你有像

TYPE * x; 

聲明一個變量x,其保持指針類型類型的值。

而當你有

*x 

其中x是一個指針,這指的是指向什麼x到,這被稱爲間接引用(因爲指針也被稱爲參考文獻)