我看过很多讨论指针交换
的文章,其中很多都使用了这样的代码:
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;
}
谢谢!
最佳答案
因为*p1
的类型是int*
。此类型与 int
不兼容,需要进行强制转换。此外,转换本身是实现定义的,int
可能不够长,无法在不丢失位的情况下存储指针的值。
在指针为 64 位长且 int
为 32 位长的 64 位计算机上,它可能会失败。
顺便考虑使用下面的宏来实现适用于任何类型并提供类型检查的交换
操作:
#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)
关于c - C语言中指针交换时使用整数声明而不是指针整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72542734/