如何在带有函数签名的函数中交换指针地址?
假设:
int weight, height;
void swap(int* a, int* b);
那么,在退出此函数后,实际参数(weight
和 height
)的地址会发生更改。这有可能吗?
#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的swap函数,并将指针传递给它。
#include <algorithm>
std::swap(pa, pb);
你的问题似乎不是很清楚。std::swap
使用了什么 - 正确,引用。swap(&(&a), &(&b));
在C++中,您将编写以下代码:
void swap(int *a, int *b)
{
std::swap(*a, *b);
}
std::swap(a, b);
新答案(由于问题已经重新定义)
是,变量的地址在编译时确定,因此无法交换。但是,指向变量的指针可以被交换。
旧答案:这是当问题仍然涉及通过函数交换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;
}
看起来您可能对一些术语感到困惑。
通常,一个对象都有一个地址。这是对象在内存中的位置。一些临时对象没有地址,因为它们不需要被存储。例如,在表达式 (2+2)*3
中,临时的“4”对象就是这样一个例外。
指针是一种存储另一个对象地址的对象。因此,对于每种类型,都有相应的指针。例如,int
有 int*
,std::string
有 std::string*
,等等。
现在,您写了关于“指针地址”的内容。它们确实存在。毕竟,我写过指针是一个对象,因此它有自己的地址。而且您可以将该地址存储在另一个指针中。例如,您可以将 int*
的地址存储在 int* *
中。但是您真的想要那样做吗?还是您的意思是“指针引用的地址”?
现在,您以身高和体重作为示例。在 C++ 中交换它们的标准方式只是 std::swap(width, height)
。注意前缀 std::
,它是 C++ 标准库函数的前缀。 std::swap
几乎可以交换任何东西。整数、浮点数、妻子。(开玩笑)。
您似乎还有另一个交换函数。它接受两个指向整数的指针,这意味着它想要两个整数的地址。在这种情况下,这些很容易提供。 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
}
如果您想更改指针的地址,则必须将这些指针的指针作为参数传递:
void swap(int **a, int **b); //as prototype
这些例子只是改变指针的值。
void swapPointers(int** first, int** second) {
int* temp = *first;
*first = *second;
*second = temp;
return;
}