在C++中交换指针的地址

The*_* do 5 c++ pointers

如何在具有签名的函数内交换指针?

让我们说:

int weight, height;
void swap(int* a, int* b);
Run Code Online (Sandbox Code Playgroud)

因此,在退出此函数后,将更改实际参数(weightheight)的地址.有可能吗?

Unc*_*ens 17

如果要交换指针指向的地址,而不仅仅是存储在该地址的值,则需要通过引用(或指针指针)传递指针.

#include <cassert>
void swap(int*& a, int*& b)
{
    int* c = a;
    a = b;
    b = c;
}

int main()
{
    int a, b;
    int* pa = &a;
    int* pb = &b;

    swap(pa, pb);

    assert(pa == &b);  //pa now stores the address of b
    assert(pb == &a);  //pb now stores the address of a
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用STL交换函数并将指针传递给它.

#include <algorithm>

std::swap(pa, pb);
Run Code Online (Sandbox Code Playgroud)

但是,你的问题似乎并不十分清楚.


RED*_*AIR 9

在C++中你会写

 void swap(int *a, int *b)
 {
    std::swap(*a, *b);
 }
Run Code Online (Sandbox Code Playgroud)

或者更确切地说使用:

 std::swap(a, b);
Run Code Online (Sandbox Code Playgroud)


Toa*_*oad 8

新的答案(因为问题已经重新制定)

变量的解决是在编译时确定的,因此不能交换.但是可以交换指向变量的指针.

旧答案: 当问题仍然暗示通过函数交换2个变量的值时,这就是答案:

功能调用:

 int width=10, height=20;
 swap(&width, &height)
Run Code Online (Sandbox Code Playgroud)

执行:

 void swap(int *a, int *b)
 {
      int temp;
      temp=*a;
      *a = *b;
      *b = temp;
 }
Run Code Online (Sandbox Code Playgroud)

或...不使用临时变量:; ^)

 void swap(int *a, int *b)
 {
      *a ^= *b;
      *b ^= *a;
      *a ^= *b;
 }
Run Code Online (Sandbox Code Playgroud)

请注意最后一个方法是否违反案例:​​swap(&a,&a).user9876在评论中非常尖锐地指出.

  • XOR技巧只不过是一群试图变聪明(并没有真正成功)的游荡者.你不能说它的速度,因为它没有指定它将编译成什么(任何半正式的编译器都会在寄存器中执行它,这将使速度差异成为现实.并使变量的保存无关紧要).对编码人员犯下的最大罪行是牛仔编写难以维护的软件.无论如何,感谢收听我的咆哮:-)不要在这里投票任何东西,因为它既无关紧要又多次欺骗. (12认同)
  • 我不明白为什么有人会在现代处理器上使用XOR技巧.它会慢一些.如果处理器完全执行你所编写的内容,那么XOR技巧就是9次内存访问,但简单的方法只有4次.在现代CPU上,内存访问比其他任何东西慢得多.如果编译器优化XOR技巧以将中间值存储在寄存器中,因此只有4个存储器访问,那么在简单解决方案中仍然需要3个XOR操作.此外,一个非常聪明的编译器可以内联简单的解决方案,它可能根本不生成任何代码. (4认同)

MSa*_*ers 6

看来你可能对术语有点困惑.

对象通常具有地址.这是对象所在的内存中的位置.某些临时对象没有地址,因为它们不需要存储.这种异常是表达式中的临时"4"对象(2+2)*3

指针是存储另一个对象的地址的对象.因此,对于每种类型,都有一个匹配的指针.intint*,std::stringstd::string*,等等.

现在,你写下"指针地址".他们存在.毕竟,我写道指针是一个对象,因此它有自己的地址.并且您可以将该地址存储在另一个指针中.例如,你可以存储和地址int*int* *.但你真的打算这样做吗?或者你的意思是" 指针引用的地址"?

现在,你给出身高和体重作为例子.在C++中交换它们的标准方法很简单std::swap(width, height).请注意std::,这是C++标准库函数的前缀.std::swap将交换几乎所有东西.投注,花车,妻子.(J/K).

显然你有另一个交换功能.它接受两个指向整数的指针,这意味着它需要两个整数的地址.在这种情况下,这些很容易提供.width是一个整数,&width是它的地址.这可以存储在指针参数中int* a.同样,您可以将地址存储&height在参数中int*b.把它放在一起,你接到电话swap(&width, &height);

这是如何运作的?该swap(int*a, int*b)函数有两个指针,在内存中保存两个整数的地址.那么,它能做的是[1]留出第一个整数的副本,[2]复制第一个整数所在的内存中的第二个整数,[3]将第一个整数复制回第二个整数的内存中整数是.在代码中:

 void swap(int *a, int *b)
 {
      int temp = *a; // 1
      *a = *b;       // 2
      *b = temp;     // 3
 }
Run Code Online (Sandbox Code Playgroud)