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

标签 c pointers integer swap dereference

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

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/

相关文章:

c - 了解结构中字符串的动态内存分配

Java:将整数拆分为 2 个字节,然后将它们再次组合成一个整数

c - 为什么这段 C 代码不起作用?我无法使用指向结构的指针访问卷号

C编程和error_code变量效率

c - 在 C 中取消分配结构内部的内存

c - 在 C 中,我可以将字符串保留为 char*,然后使用指针指向其他字符串吗?

c - 是否有 strsep() 函数的 Windows 变体?

C : Static to dynamic allocation on multiple dimension array

c++ - 为什么系统在没有警告的情况下接受 long int 作为 int 参数传递?

mysql - 当我进行 LEFT JOIN 时,我的 SIGNED INT 被转换为 UNSIGNED