如何在具有签名的函数内交换指针?
让我们说:
int weight, height;
void swap(int* a, int* b);
Run Code Online (Sandbox Code Playgroud)
因此,在退出此函数后,将更改实际参数(weight
和height
)的地址.有可能吗?
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)
但是,你的问题似乎并不十分清楚.
在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)
新的答案(因为问题已经重新制定)
变量的解决是在编译时确定的,因此不能交换.但是可以交换指向变量的指针.
旧答案: 当问题仍然暗示通过函数交换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在评论中非常尖锐地指出.
看来你可能对术语有点困惑.
对象通常具有地址.这是对象所在的内存中的位置.某些临时对象没有地址,因为它们不需要存储.这种异常是表达式中的临时"4"对象(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
}
Run Code Online (Sandbox Code Playgroud)