我尝试使用指针交换两个整数...
#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
..
请解释此计划中真正发生的事情..
答案 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
之后 a
点45
的地址,然后将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;
避免使用第三个变量。
修改强> 此技术仅适用于无符号整数类型。