我看过许多讨论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;
}

谢谢

推荐答案

因为*p1的类型是int*.此类型与int不兼容,需要转换.此外,强制转换本身是实现定义的,并且int的长度可能不足以在不丢失位的情况下存储指针的值.

它可能会在64位计算机上失败,其中指针的长度为64位,int的长度为32位.

顺便说一句,考虑使用下面的宏来实现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)

C++相关问答推荐

如何避免使用相对路径包含在c中

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

在Windows上构建无聊的SSL x64

如何将不同长度的位转换成字节数组?

编译的时候g++通常会比GCC慢很多吗?

LibpCap禁用监视器模式(C、MacOS)

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

GDB输出ARM助记符

为什么此共享库没有预期的依赖项?

在句子中转换单词的问题

RawMotion的XInput2错误(具有较高值的XISelectEvents上的BadValue)

强制转换变量以在 struct 中蚕食

如何使用唯一数字对整型进行分区

为什么WcrTomb只支持ASCII?

GetText不适用于包含国际字符的帐户名称

静态初始化顺序失败是否适用于C语言?

&stdbool.h&q;在嵌入式系统中的使用

RISC-V GCC编译器错误编译ASM代码

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

free后内存泄漏?