2015-04-28 128 views
2

當丹尼斯中號Richies書「C程序設計語言」,它講述的指針,而其中一個例子是交換兩個指針:混亂交換指針

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

什麼是略微困惑我是*a = *b。如果b已經是傳入的指針,爲什麼需要在將其分配給*a之前解除引用?爲什麼不會a = b作爲他們兩個指針?

+2

指針不是它們指向的值。你需要閱讀更多關於指針和地址的信息。 –

+1

此代碼交換指向值,即整數,而不是指針本身。如果這本書使用了「交換指針」這個只是草率的不精確的語言(即使裏奇自己可能犯了一個錯誤)。 –

+0

@ n.m。那是我出錯的地方。它實際上是在討論交換價值觀,我誤以爲這是交換指針。 –

回答

2

a = b表示您將b的地址分配給a,這不正確。

用於交換兩個數字表示您需要獲得value at that address並且必須交換該值。
所以正確的方法是做*a = *b;即在b地址的值分配給地址a的值。

+0

啊,現在有道理謝謝:) –

+0

不客氣@LOLKAT :) – Himanshu

0

*ptr是指針的取消引用。

*a = *b;表示您將位置b中包含的值放入a指向的位置。這是交換功能所要求的。

a = b;表示您將指針b的值分配給指針a。這不是交換邏輯中你需要的。

0

a = b,既ab將指向由b指出的位置,這將打敗傳遞ab作爲參考的目的;因爲函數返回後swap()不會被反映出來。

0

令人困惑的原因是該函數實際上不交換指針。 下面讓我們首先假設函數交換指針和它的實現必須是看你想的

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

的功能可以被稱爲以下方式功能的

int x = 10; 
int y = 20; 
int *px = &x; 
int *py = &y; 

swap(px, py);  

參數是其由參數初始化的局部變量。所以函數調用可以看起來如下

void swap(/*int *a, int *b*/) 
{ 
    int *a = px; 
    int *b = py; 

    int *temp; 
    temp = a; 
    a = b; 
    b = temp 
} 

函數內部這些局部變量被交換,但原來的參數沒有改變。局部變量a和b獲得存儲在px和py中的值的副本。因此,在退出函數後,這些局部變量將被銷燬,同時px和py不會被改變。

要更改指針的函數應該通過以下方式

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

在這種情況下,功能互換值指向指針int **aint **b並且這些值存儲在PX和PY的值。當然,函數必須被調用像

swap(&px, &py); 

現在,讓我們回到原來的功能

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

它類似於交換指針的功能。但是在這種情況下,它會交換由int *aint *b指向的對象。