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

时间:2009-12-01 13:30:25

标签: c++ pointers

如何在具有签名的函数中交换指针地址?

让我们说:

int weight, height;
void swap(int* a, int* b);

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

6 个答案:

答案 0 :(得分:16)

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

#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
}

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

#include <algorithm>

std::swap(pa, pb);

但你的问题似乎并不十分清楚。

答案 1 :(得分:8)

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

是变量的地址是在编译时确定的,因此不能交换。但是可以交换指向变量的指针。

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

函数调用:

 int width=10, height=20;
 swap(&width, &height)

实现:

 void swap(int *a, int *b)
 {
      int temp;
      temp=*a;
      *a = *b;
      *b = temp;
 }

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

 void swap(int *a, int *b)
 {
      *a ^= *b;
      *b ^= *a;
      *a ^= *b;
 }

请注意最后一种方法会破坏案例:swap(&amp; a,&amp; a)。 user9876在评论中非常清楚地指出了这一点。

答案 2 :(得分:8)

在C ++中你会写

 void swap(int *a, int *b)
 {
    std::swap(*a, *b);
 }

或者更确切地说使用:

 std::swap(a, b);

答案 3 :(得分:6)

看起来你可能对术语感到有点困惑。

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

中的临时“4”对象

指针是存储另一个对象的地址的对象。因此,对于每种类型,都有一个匹配的指针。 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
 }

答案 4 :(得分:1)

如果要更改指针的地址,则必须将这些指针的指针作为参数传递:

void swap(int **a, int **b); //as prototype

这些示例只是更改指针的值。

答案 5 :(得分:0)

一个好的解决方案是:

void swapPointers(int** first, int** second) {
    int* temp = *first;
    *first = *second;
    *second = temp;
    return; 
}
相关问题