使用C中的指针交换两个数字

时间:2013-10-26 18:09:56

标签: c pointers

我尝试使用指针交换两个整数...

#include<stdio.h>
int main()
{
int a,b,*i,*j;
printf("Enter two integer:");
scanf("%d%d",&a,&b);
i=&a;
j=&b;
a=*j;
b=*i;
printf("\n %d \t %d",a,b);
return 0;
}

输入

  

12 45

输出

  

45 45

经过一些试验,我发现如果我先指定b=*i然后再指定a=*j,则第一个整数,即12正在重复...

为什么会这样? 在我对指针的理解中,这就是我所做的。 我已将*j(即存储在a地址中的变量值)分配给b*i(即存储在{{1}地址中的变量值})到b ..

请解释此计划中真正发生的事情..

6 个答案:

答案 0 :(得分:4)

从概念上讲,这就是你想要做的事情:

int temp = a; //temp <- 12
a = b;        //a <- 45
b = temp;     //b <- 12

从概念上讲,这就是你正在做的事情:

a = b; //a <- 45
b = a; //b <- 45

如果您使用的是C ++ 11,则可以“优雅地”执行此操作:

std::tie(b, a) = std::make_tuple(a, b);

答案 1 :(得分:3)

这就是:

i=&a; //i points to a
j=&b; //j points to b
a=*j; //assign the value of b to a
b=*i; //assign the value of a, which has been assigned to the value of b in the previous step

这是一种解决方法:

int temp = a;
a = b;
b = temp;

答案 2 :(得分:3)

Simples:

#include<iterator>
std::iter_swap(i,j);

或者确实

#include<algorithm>
std::swap(a,b);

或纯粹主义者

using std::swap;
swap(a,b); // allow for ADL of user-defined `swap` implementations

答案 3 :(得分:2)

a=*j;
b=*i;
在第一个语句i值变为a之后

a45的地址,然后将a值分配给b,{{1} }}也变为b

45

现在当你改变了 addressof `a` ^ i-----| addressof 'b' ^ j-----| 然后a取消引用的值也会发生变化。

只需使用临时变量

i

答案 4 :(得分:2)

i=&a; //i points to a
j=&b; //j points to b
a=*j; // this statement is equvivalent to a = b; (since *j and b both are same)
so a = 45;
now
b=*i; // this statement is equvivalent to b = a; (since *i and a both are same) 
but a value is changed to 45 in previous statement, so the same 45 is assigned to b variable also 

您可以使用临时变量

答案 5 :(得分:0)

这是因为我指向a,所以一旦你给a分配了东西,就会丢失存储在a中的原始值。您可以引入第三个变量temp来在分配之间存储值(比如在发布的一个答案中),或者做一些技巧,如

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

避免使用第三个变量。

修改 此技术仅适用于无符号整数类型。