2012-07-02 49 views
0
int a=5; b=7; 
int *pa=&a, *pb=&b; 

如何交換的一個的值和從交換指針的值即papb(未*pa*pb)b處?兩種情況下的結果都不一樣?C語言:如何交換指針與交換指向的值不同?

什麼時候我們不得不使用指針交換?

我在本書中有一個例子,它使用與字符串數組交換指針,例如char* []。這是作爲排序機制的一部分完成的。交換功能爲存儲字符串的char* []類型變量執行指針交換。我不明白爲什麼功能交換的形式爲void swap(char** , char**)

我找不到任何解釋,因此我的問題在其他地方。

:(如何swap(int*& a, int*& b)比較swap(char** a,char** b)

回答

1

swap(int*& a, int*& b)不是C,但C++,它是通過引用傳遞,而不是實際的指針。 有了這個例子中,你不會明白的傳遞指針或傳遞變量。

想想你將如何交換2個整數和2串I,E

int a=10, b=20; 
char *s1="ABC", *s2="PQRS"; 
swap_int(a, b); 
swap_str(s1, s2); 
0

使用「[]」表示存儲一些值的存儲塊:

之前交換:

a: [5] 
b: [7] 

交換後:

a: [7] 
b: [5] 

然後訪問將使7

交換之前:

pa: [&a] (that is, the address of a) 
pb: [&b] 

交換後:

pa: [&b] 
pb: [&a] 

然後訪問pa會導致b的地址,並且取消引用(* pa)將得到b的值。對於char **,我認爲你描述的排序過程是對「char *」的數組進行排序,這是C中的經典字符串。你可以看到一個「char 」實體作爲「字符串」對象。而「char *」是「string *」,它應該被視爲一個「string」對象的數組。然後,您可以描述排序中涉及的分配,如上面的「a」和「b」場景。

3

之所以選擇使用指針交換變量值是因爲它避免了複製大量內存。任何內存複製都需要花費時間,以便將內存複製量降到最低,從而使算法運行得更快。

內存複製如何成爲問題?

考慮下面的僞代碼,它可以換就地任何類型的兩個值:

tempValue = value1;  /* first memory copy */ 
value1 = value2;  /* second memory copy */ 
value2 = tempvalue; /* third memory copy */ 

在你原來的問題,你換2個整數。假設一個整數的寬度是4個字節,那麼上面的僞代碼將在三次複製操作中交換兩個整數。複製的內存總數:12個字節。如果我們假設一個指針的寬度也是4個字節,那麼交換指針值也需要複製12個字節的內存。在這種情況下,複製交換值的內存量與交換指針相同。在這種情況下,任何一種方法都會有相同的性能。

現在考慮下面的代碼段:

typedef struct _mystruct 
{ 
    char buffer[128]; /* size of structure becomes at least 128 bytes */ 

} MYSTRUCT, *PMYSTRUCT; 

MYSTRUCT value1, value2; 

PMYSTRUCT pValue1 = &value1; 
PMYSTRUCT pValue2 = &value2; 

MYSTRUCT的大小是至少128個字節。使用上面的僞代碼來交換value1value2的值將需要三個128字節的內存拷貝,或總共384個字節。另一方面,如果我使用兩個指針pValue1pValue2交換這些值,假設指針的寬度是4個字節,則在交換過程中複製的字節數與上面的整數示例相同;只有12個字節。與384字節相比,如果你不使用指針,這個速度非常快,並且性能會更好。

這就是爲什麼char**被用作字符串交換函數的參數。被交換的字符串的長度是未知的,因爲交換值意味着複製內存,長字符串可能會顯着降低性能。使用指針意味着交換的性能將保持不變,無論交換的字符串的長度如何。