我看過很多討論的文章pointer swapping,??其中很多都使用了這個代碼:
void ptr_swap(int **p1, int **p2)
{
int *temp = *p1;
*p1 = *p2;
*p2 = temp;
}
但我不清楚為什么有必要將 temp 宣告為指標而不是自然整數。當我測驗它時,它沒有任何區別。
void ptr_swap(int **p1, int **p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
謝謝!
uj5u.com熱心網友回復:
因為型別*p1是int*。這種型別不兼容,int需要強制轉換。此外,強制轉換本身是實作定義的,int可能不夠長,無法在不丟失位的情況下存盤指標的值。
在指標為 64 位長且int為 32 位長的 64 位機器上,它可能會失敗。
順便說一句,考慮使用下面的宏來實作swap適用于任何型別并提供型別檢查的操作:
#define SWAP(a,b) \
do { \
char tmp__[sizeof(a)]; \
void *va__ = &(a); \
void *vb__ = &(b); \
(void)sizeof(&(a) - &(b)); \
memcpy(tmp__, va__, sizeof tmp__); \
memcpy( va__, vb__, sizeof tmp__); \
memcpy(vb__, tmp__, sizeof tmp__); \
} while (0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/487783.html
上一篇:結構的大小
