更改局部变量的地址

时间:2013-07-04 00:55:25

标签: c++ pointers swap

我想使用xor algorithm交换两个局部变量,但是它不允许我更改变量的地址。如果我创建指向变量的指针,它将允许它,但是可以在不使用指针的情况下执行此操作吗?

我正在尝试这样做

Point a = Point();
Point b = Point(1,1);

&a ^= &b;
&b ^= &a;
&a ^= &b;

这是我能够达到我想要做的最接近的

Point a = Point();
Point b = Point(1,1);

Point *a_ptr = &a;
Point *b_ptr = &b;

a_ptr = (Point *)(((unsigned long)a_ptr) ^ (unsigned long)b_ptr);
b_ptr = (Point *)(((unsigned long)a_ptr) ^ (unsigned long)b_ptr);
b_ptr = (Point *)(((unsigned long)a_ptr) ^ (unsigned long)b_ptr);

// The pointers are switched, but this will not work
&a = a_ptr;

2 个答案:

答案 0 :(得分:1)

唯一可行的方法是,如果你实际上对点的值进行了xor交换。在您的代码中,您似乎正在尝试在堆栈上设置一个您无法执行的值的地址。

我建议使用std::swap http://en.cppreference.com/w/cpp/algorithm/swap
要使用它,你的对象将赋予moveContructible和moveAssignable。

所以简而言之,确切地说你想做的事情是不可能的,因为你不能分配给变量的地址。但是你可以使用point的值,多种方式实现类似的效果,制作指针或std::swap

答案 1 :(得分:0)

C语言变量在运行时不存在,就像高级语言中的变量一样。局部变量“a”对编译器来说意味着“堆栈帧的地址 - 2”,或者它是什么。此引用仅在编译时存在,并由声明修复。在运行时,生成的代码只是从硬编码的地址中提取。因此,使用代码使变量指向不同的位置是试图改变不存在的东西。