仅使用指针和两个非指针变量进行交换?

时间:2014-05-20 17:22:28

标签: c++ pointers swap

我想使用没有任何函数调用的指针或任何临时变量交换两个变量。

我目前的代码是:

void main()
{
  int a=1, b=2, *c;

  cout << a << b << endl;

  *c = a;
  a = b;
  b = *c;

  cout << a << b << endl;

  getch();
}

代码适用于Turbo C ++但不适用于Visual Studio,而且我认为使用未初始化的指针变量是不好的做法。

那么有人能告诉我在这段代码中我需要做些什么改变才能在visual studio上工作?如果有更好的方法请告诉。

谢谢..

3 个答案:

答案 0 :(得分:2)

在设置某个值之前,您无法使用c的值。所以*c = a;是胡说八道。您必须先c = <something>

答案 1 :(得分:0)

您可以使用所谓的XOR交换,请参阅此链接http://en.wikipedia.org/wiki/XOR_swap_algorithm

if(&a != &b) // test that the 2 variables don't have the same address (in this case you get a=b=0)
{
   a = a^b;
   b = a^b;
   a = a^b;
}

使用指针(来自维基百科)

 void xorSwap (int *x, int *y)
 {
     if (x != y)
     {
         *x ^= *y;
         *y ^= *x;
         *x ^= *y;
     }
 }

还有其他方法可以在没有临时值的情况下执行此操作,例如加/减法

a = a + b;
b = a - b;
a = a - b;

但是你应该总是依靠编译器来为你做优化,即使用temp而不用担心它。

答案 2 :(得分:0)

以下是psuedo-assembly语言中的一些特定于平台的方法:

Push&amp;弹出
许多处理器都有指令将值压入堆栈并加载它 这与使用临时变量的方法基本相同。

push register 0
push register 1
pop register 0
pop register 1

交换指示
某些处理器具有交换(例如xchg),允许您交换(交换)两个寄存器。某些处理器可能允许您将寄存器与存储位置进行交换     xchg R0,R1;将寄存器0与寄存器1交换。

<强>摘要
一些处理器具有推入堆栈并从堆栈弹出的能力。这可用于交换寄存器中的值。另一种与处理器相关的交换方法是使用处理器&#34;交换&#34;或&#34;交换&#34;指令。并非所有处理器都有这些指令,因此这些技术不可移植。