使用指针交换值

3
我有这段代码片段。
int i = 5;
int k = 7;
int * iPtr;
int * jPtr;
int * kPtr;

iPtr = &i;
kPtr = &k;

我需要使用指针来交换i和k。下面是我的做法:
*jPtr = *kPtr ;
*kPtr = *iPtr ;
*iPtr = *jPtr ;

这是最好的方法吗?还是有更好的方法?


1
这应该有一个作业标签! - Stephen Nutt
4个回答

11

在我的看法中,C++中最好的方法是使用std::iter_swap()

#include<algorithm>

// ...
int *iPtr = &i, *kPtr = &k;
std::iter_swap(iPtr, kPtr);

你可能认为这有些过于复杂,但如果你无论如何都包含<algorithm>,我会持不同意见。当然,在作业的情况下,如果教师的目的是让你熟悉STL,那么这个答案仅适用于此。如果目的是介绍指针,那么最好的解决方案是引入一个临时变量j

int j;
int *iPtr = &i, *kPtr = &k, *jPtr = &j;
*jPtr = *kPtr;
*kPtr = *iPtr;
*iPtr = *jPtr;

6

只是为了好玩,这个方法可以不用第三个变量来实现...

*iPtr ^= *kPtr;
*kPtr ^= *iPtr;
*iPtr ^= *kPtr;

这是一个古老的汇编语言技巧:XOR交换算法


2
这个东西让我感到不爽的是,好像比std::swap更多的人知道(并使用)这个技巧。 这确实是一个不错的技巧,但正如维基百科文章所提到的那样,使用临时变量通常更有效率。 而且,如果你渴望位操作,例如"Hacker's Delight"或"Bit Twiddling Hacks"之类的书有很多更有趣的内容。 (+1还是要给的,因为这只是“为了好玩”,我只是有点暴躁。) - leander
1
我非常确定我在某个地方读到过,在现代CPU和现代编译器上,这种老式的技巧实际上比声明新变量并使用它更慢。当然,我自己没有测量过。 - Stewart
3
@leander - 我只会在汇编语言中做这件事。高级语言的整个重点在于清晰易懂,而这种方式完全是不透明的。 - egrunin
@Stewart:是的,如果你看一下反汇编代码,通常情况下会更糟糕,前提是编译器能找到一个空闲寄存器。这里链接的维基百科文章提到了这一点。 - leander
同意。我的挫败感是:我们为加入公司的候选人设置了一个筛选测试,要求他们填写 void inplace_reverse( char * null_terminated_string ) 这样的东西 - 大多数情况下,我们使用此测试来测试大学三年级和四年级的候选人 - 但是约80%的人在准备从字符串的开头和结尾迭代后,就会跳到异或技巧。这让我想把自己的头发都拔光。(该问题真正旨在测试边缘情况的处理,而不是“你能交换两个字节吗”)。 - leander

4

您只是忘记为临时变量分配空间:

int i = 5; 
int k = 7; 
int * iPtr; 
int * jPtr = new int;
int * kPtr; 

iPtr = &i; 
kPtr = &k; 
...
*jPtr = *kPtr ; 
*kPtr = *iPtr ; 
*iPtr = *jPtr ; 

delete jPtr;

2
当然,更好的方法是创建一个int j而不是将其作为指针,但我想这会违反规则。 - Brendan Long
是的...这是为了澄清指针的概念(为了课堂),所以我们必须使用指针。 - Ayush
3
最好的方法是使用std::swapstd::swap(i,k); - Khaled Alshaya
2
不,std::swap()将交换指针,以便i指针将指向k指针,并且k指针将指向i指针。原始整数仍将保持相同的值。如果要交换基础值,您需要使用std::iter_swap() - wilhelmtell

1
你的老师让你使用指针的原因是为了让你熟悉将变量的地址(指针)传递给函数。这样你就可以做到这种事情:
void add_bonus_points(int *x)
{
    *x = *x + 100;
}

void main()
{
    int a = 2;

    printf("%d", a); // 2

    add_bonus_points(&a);
    printf("%d", a); // 102

}

关于交换,这是代码:
void swap(int *x, int *y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

void main()
{
    int a = 5;
    int b = 7;

    swap(&a, &b);
    printf("%d %d", a, b);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接