gpt4 book ai didi

c - C语言中指针交换时使用整数声明而不是指针整数

转载 作者:行者123 更新时间:2023-12-02 01:35:05 25 4
gpt4 key购买 nike

我看过很多讨论指针交换的文章,其中很多都使用了这样的代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com