如何在具有签名的函数中交换指针地址?
让我们说:
int weight, height;
void swap(int* a, int* b);
因此,在退出此函数后,将更改实际参数(weight
和height
)的地址。它有可能吗?
答案 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
指针是存储另一个对象的地址的对象。因此,对于每种类型,都有一个匹配的指针。 int
有int*
,std::string
有std::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;
}