使用指针交换值

xbo*_*nez 3 c++

我有这个代码片段

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

iPtr = &i;
kPtr = &k;
Run Code Online (Sandbox Code Playgroud)

我需要使用指针交换i和k.这就是我这样做的方式:

*jPtr = *kPtr ;
*kPtr = *iPtr ;
*iPtr = *jPtr ;
Run Code Online (Sandbox Code Playgroud)

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

wil*_*ell 11

在我看来,在C++中做到这一点的最好方法是std::iter_swap():

#include<algorithm>

// ...
int *iPtr = &i, *kPtr = &k;
std::iter_swap(iPtr, kPtr);
Run Code Online (Sandbox Code Playgroud)

你可能认为这是一种矫枉过正,但如果你包括在内,我会不同意<algorithm>.当然,在作业的情况下,如果教师的意图是让您熟悉STL,这个答案就成立了.如果目的是向您介绍指针,那么最好的解决方案是引入一个临时变量j:

int j;
int *iPtr = &i, *kPtr = &k, *jPtr = &j;
*jPtr = *kPtr;
*kPtr = *iPtr;
*iPtr = *jPtr;
Run Code Online (Sandbox Code Playgroud)


egr*_*nin 6

只是为了好玩,这将没有第三个变量...

*iPtr ^= *kPtr;
*kPtr ^= *iPtr;
*iPtr ^= *kPtr;
Run Code Online (Sandbox Code Playgroud)

这是一种旧的汇编语言技巧:XOR交换算法

  • @leander - 除了汇编之外,我永远不会*做任何事.高级语言的重点是清晰度,这是100%不透明的. (3认同)
  • 它继续让我感到烦恼,似乎更多人了解(并使用)这个技巧而不是std :: swap.这是一个巧妙的技巧,是的,但正如维基百科的文章所提到的那样,使用临时工具往往更有效率.而且,如果你渴望有点蠢蠢欲动,那么还有很多有趣的东西,例如Hacker's Delight或Bit Twiddling Hacks等.(+1无论如何,因为它"只是为了好玩";我只是在胡思乱想.) (2认同)