當丹尼斯中號Richies書「C程序設計語言」,它講述的指針,而其中一個例子是交換兩個指針:混亂交換指針
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp
}
什麼是略微困惑我是*a = *b
。如果b
已經是傳入的指針,爲什麼需要在將其分配給*a
之前解除引用?爲什麼不會a = b
作爲他們兩個指針?
當丹尼斯中號Richies書「C程序設計語言」,它講述的指針,而其中一個例子是交換兩個指針:混亂交換指針
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp
}
什麼是略微困惑我是*a = *b
。如果b
已經是傳入的指針,爲什麼需要在將其分配給*a
之前解除引用?爲什麼不會a = b
作爲他們兩個指針?
a = b
表示您將b
的地址分配給a
,這不正確。
用於交換兩個數字表示您需要獲得value at that address
並且必須交換該值。
所以正確的方法是做*a = *b;
即在b
地址的值分配給地址a
的值。
啊,現在有道理謝謝:) –
不客氣@LOLKAT :) – Himanshu
*ptr
是指針的取消引用。
*a = *b;
表示您將位置b
中包含的值放入a
指向的位置。這是交換功能所要求的。
a = b;
表示您將指針b的值分配給指針a。這不是交換邏輯中你需要的。
做a = b
,既a
和b
將指向由b
指出的位置,這將打敗傳遞a
和b
作爲參考的目的;因爲函數返回後swap()
不會被反映出來。
令人困惑的原因是該函數實際上不交換指針。 下面讓我們首先假設函數交換指針和它的實現必須是看你想的
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 **a
和int **b
並且這些值存儲在PX和PY的值。當然,函數必須被調用像
swap(&px, &py);
現在,讓我們回到原來的功能
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp
}
它類似於交換指針的功能。但是在這種情況下,它會交換由int *a
和int *b
指向的對象。
指針不是它們指向的值。你需要閱讀更多關於指針和地址的信息。 –
此代碼交換指向值,即整數,而不是指針本身。如果這本書使用了「交換指針」這個只是草率的不精確的語言(即使裏奇自己可能犯了一個錯誤)。 –
@ n.m。那是我出錯的地方。它實際上是在討論交換價值觀,我誤以爲這是交換指針。 –