2015-03-02 137 views
0

我發現如果你將一個指針地址賦值給FUNCTION中另一個指針的地址,它不會改變主函數中的in值,但是通過在main中做同樣的事情,它會更改。那麼這是什麼原因呢?在函數中引用另一個指針的C指針

void func(int *a, int *b){ 
    b = a; 
} 


int main(){ 
    int i= 5, k =6, *a=&i, *b=&k; 
    printf("%d %d\n",*a,*b); //output 5 6 
    b = a; 
    printf("%d %d\n",*a,*b); //output 5 5 

    a=&i; 
    b=&k; 
    func(a,b); 
    printf("%d %d\n",*a,*b); //output 5 6 
    printf("%d %d\n",*a,*b); //output 5 6 
} 
+1

因爲您通過複製傳遞指針,然後更改指針的副本。 – 2015-03-02 21:57:29

+0

順便說一句,你永遠不會調用函數。這是一個複製錯誤? – Barmar 2015-03-02 21:58:31

回答

1

在此功能

void func(int *a, int *b){ 
    b = a; 
} 

參數a和b是該函數的局部變量。退出該功能後,它們將被銷燬。該函數處理參數的副本。如果你希望函數自己改變原始參數,你必須傳遞指針。例如

void swap(int **a, int **b){ 
    int *tmp = *a; 
    *a = *b; 
    *b = tmp; 
} 
0

您的功能:

void func(int *a, int *b){ 
    b = a; 
} 

沒有做任何事情,它只是需要代表內存地址作爲參數的兩個值,並分配一個到另一個不受任何外部影響。它只是將一個值寫入另一個(可能不是那樣,因爲編譯器可能會檢測到這是毫無意義的並且完全消除它),它對存儲在這些地址的信息不做任何處理。您需要遵循指針來讀取或寫入其保存值的存儲器地址,但在目前的形式中,函數不會將指針指定給另一個,而是將值指定爲ik

如果你想要一個函數改變一個參數以外的參數,你應該通過引用傳遞,這在C中只是傳遞指針,所以你需要傳遞一個指針指向指針,而不是指針 - 它會通過該指針的副本 - 相同的值,而作爲指針傳遞的指針將傳遞指針在內存中的地址,而不是其保存的值。

所以它應該是:

void func(int **a, int **b){ 
    *b = *a; 
} 

func(&a,&b),你會重現您通過b = amain做什麼。

+0

這裏沒有無符號整數 – 2015-03-02 22:15:32

+0

@MattMcNabb - 指針是無符號整數。 – dtech 2015-03-02 22:15:55

+1

不,它們是指針 – 2015-03-02 22:18:48