我有这段代码片段
int i = 5;
int k = 7;
int * iPtr;
int * jPtr;
int * kPtr;
iPtr = &i;
kPtr = &k;
我需要使用指针交换i和k。这就是我的做法:
*jPtr = *kPtr ;
*kPtr = *iPtr ;
*iPtr = *jPtr ;
这是最好的方法,还是有更好的方法?
答案 0 :(得分: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;
答案 1 :(得分:6)
只是为了好玩,这样做会没有第三个变量......
*iPtr ^= *kPtr;
*kPtr ^= *iPtr;
*iPtr ^= *kPtr;
这是一个旧的汇编语言技巧:XOR swap algorithm
答案 2 :(得分: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;
答案 3 :(得分: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
}
关于swap,这是代码:
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);
}