我遇到了问题,我无法创建一个用指针交换两个变量的简单程序。我试着用这种方式:
fslmaths -kernel
我该怎么办?
答案 0 :(得分:4)
void swap(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 7, b = 3;
std::cout << a << ' ' << b << '\n';
swap(&a, &b);
std::cout << a << ' ' << b << '\n';
}
还要考虑std::swap
答案 1 :(得分:1)
问题是您使用y
的值覆盖x
的原始值,然后将该值复制回x
。
您要做的是隐藏x
的值,将y
的值复制到其中,然后将隐藏的值移至y
。
由于您尝试使用指针执行此操作,因此您应该更改操作x=y
以使用指针。这是一个例子:
int main(int argc, char *argv[])
{
int x=5, y=10, stash;
int *px, *py;
cout << "Before: x=" << x << " y=" << y;
px = &x;
py = &y;
stash = *px;
*px = *py;
*py = stash;
cout << "After: x=" << x << " y=" << y;
}
答案 2 :(得分:-2)
这是另一种在不使用第三个变量的情况下交换两个变量的值的旧方法:
x = x + y; // x now becomes 15
y = x - y; // y becomes 10
x = x - y; // x becomes 5
正如某人已经指出的那样,另一种方法是使用xor
。
x = x ^ y; // x now becomes 15 (1111)
y = x ^ y; // y becomes 10 (1010)
x = x ^ y; // x becomes 5 (0101)
还有一种单行方式:
x = x + y - (y = x);
您不一定需要指针。
限制 - 正如所有评论员所指出的那样,所有这些方法都存在局限性。如果x
和y
的总和超过INT_MAX
(在正面可能等于2,147,483,647而在32位系统的负面则为-2,147,483,648),这些方法可能会给您不正确的结果)和你的C实现不包围有符号整数。但是对于您的程序,如果您使用相对较小的数字或者您的C实现也包含有符号整数,那么使用这3种方法中的任何一种都不会有任何问题。但是,如果您认为总和可能超过INT_MAX
,则可以使用旧式临时变量方法交换值或使用库中提供的标准swap
函数。