我正在尝试编写一个函数,它将两个指针作为参数,然后使第一个指针指向第二个指针所指向的对象,第二个指针指向第一个指向的对象。
void swap(int *x, int *y)
{
int *s;
s = x;
x = y;
y = s;
}
在主要功能中,我会做类似
的事情int x, y;
swap(&x, &y);
std::cout << &x << " " << &y << std::endl;
但似乎地址不会改变。
如果我取消引用指针并尝试更改值,则按预期交换值。我想知道为什么这个函数不会改变指针指向的位置。
答案 0 :(得分:4)
您的函数按值接受指针,因此它返回后将无法显示任何修改。实际上,您正在交换指针的副本的值。
答案 1 :(得分:4)
您要做的是std::swap
template <class T> void swap ( T& a, T& b )
{
T c(a); a=b; b=c;
}
答案 2 :(得分:1)
当您使用相同的变量名称来表示两种不同的事物时,您几乎总是会使自己的工作更加困难。
外部您的功能,x
是int
内部您的功能x
是pointer-to-int
这是你困惑和麻烦的根源。
我的代码不交换变量的地址
(事实上,我认为这是不可能的;编译器决定x
的地址。你不能改变它。
你只能改变存储在该地址的值。) < / p>
但我认为这就是你想要的:
void swap(int *ptr_x, int *ptr_y)
{
int temp;
temp = *ptr_x;
*ptr_x = *ptr_y;
*ptr_y = temp;
}
int main(void)
{
int x=5, y=9;
swap(&x, &y);
std::cout << &x << " " << &y << std::endl; // Sorry, Address of X and Y will always be the same
std::cout << x << " " << y << std::endl; // Now x is 9 and y is 5.
return 0;
}