C++ 交换C+中指针的地址+;
如何用签名交换函数中的指针地址 比如说:C++ 交换C+中指针的地址+;,c++,pointers,C++,Pointers,如何用签名交换函数中的指针地址 比如说: int weight, height; void swap(int* a, int* b); 因此,退出此函数后,实际参数(weight和height)的地址将更改。有可能吗?新答案(因为问题已重新表述) 变量的地址是在编译时确定的,因此不能交换。但是,指向变量的指针可以交换 旧答案: 当问题仍然意味着通过函数交换2个变量的值时,这就是答案: 函数调用: int width=10, height=20; swap(&width, &
int weight, height;
void swap(int* a, int* b);
因此,退出此函数后,实际参数(
weight
和height
)的地址将更改。有可能吗?新答案(因为问题已重新表述)
变量的地址是在编译时确定的,因此不能交换。但是,指向变量的指针可以交换
旧答案:
当问题仍然意味着通过函数交换2个变量的值时,这就是答案:
函数调用:
int width=10, height=20;
swap(&width, &height)
实施:
void swap(int *a, int *b)
{
int temp;
temp=*a;
*a = *b;
*b = temp;
}
或者…不使用临时变量:;^)
注意最后一个方法在这种情况下会中断:swap(&a,&a)。在注释中,USE9876非常尖锐地指出。C++中的< P> >你将写< /P>
void swap(int *a, int *b)
{
std::swap(*a, *b);
}
或者干脆用:
std::swap(a, b);
你似乎对术语有点困惑 对象通常有一个地址。这是内存中对象所在的位置。一些临时对象没有地址,因为它们不需要存储。这种例外情况是表达式
(2+2)*3
指针是存储另一个对象地址的对象。因此,对于每种类型,都有一个匹配的指针int
有int*
,std::string
有std::string*
,等等
现在,你写的是“指针地址”。它们是存在的。毕竟,我写到指针是一个对象,因此它有自己的地址。您可以将该地址存储在另一个指针中。例如,您可以将和的地址存储在int**
中。但你真的是有意的吗?或者你指的是指针引用的地址
现在,请举身高和体重为例。在C++中交换它们的标准方法是简单的<代码> STD:::交换(宽度,高度)< />代码。注意<代码> STD::/COD>,这是C++标准库函数的前缀。代码>标准::交换将交换几乎所有内容。内特、花车、妻子。(j/k)
显然,你还有另一个交换功能。它接受两个指向整数的指针,这意味着它需要两个整数的地址。在这种情况下,这些很容易提供width
是一个整数,&width
是它的地址。可以存储在指针参数int*a
中的。类似地,您可以在参数int*b
中存储地址&height
。把它放在一起,就可以调用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
这些示例只是更改指针的值。如果要交换指针指向的地址,而不仅仅是存储在该地址的值,则需要通过引用(或指针指向指针)传递指针
#include <algorithm>
std::swap(pa, pb);
#包括
无效掉期(整数*&a、整数*&b)
{
int*c=a;
a=b;
b=c;
}
int main()
{
INTA,b;
int*pa=&a;
int*pb=&b;
互换(pa,pb);
assert(pa==&b);//pa现在存储b的地址
assert(pb==&a);//pb现在存储
}
或者您可以使用STL交换函数并将指针传递给它
#include <algorithm>
std::swap(pa, pb);
#包括
标准:交换(pa,pb);
不过,您的问题似乎不太清楚。一个好的解决方案是:
void swapPointers(int** first, int** second) {
int* temp = *first;
*first = *second;
*second = temp;
return;
}
我不明白这个问题。你想交换什么地址?你可以交换重量和高度的值,而不是他们的AdRESSETHATS C,而不是C++,如果我可以评论它,最后一个方法是直觉的。ReSooSt:他已经标记了C和C++的问题,XOR诡计只不过是一群想变得聪明的笨蛋(而不是真正的成功者)。你不能谈论它的速度,因为它没有被指定编译成什么(任何半体面的编译器都会在寄存器中进行编译,这会使速度差异变得毫无意义,并使变量的保存变得无关紧要)。对程序员犯下的最大罪行是牛仔们编写难以维护的软件。无论如何,谢谢你听我的咆哮:-)不要在这里投票,因为它是不相关的,而且是重复多次的。我不明白为什么有人会在现代处理器上使用XOR技巧。速度会慢一些。如果处理器完全执行您编写的内容,那么XOR技巧是9次内存访问,但简单方法只有4次。在现代CPU上,内存访问比其他任何东西都慢得多。如果编译器优化了XOR技巧,将中间值存储在寄存器中,这样只有4次内存访问,那么在简单的解决方案中仍然有3次XOR操作是不需要的。此外,一个真正的智能编译器可以内嵌简单的解决方案,它根本不生成代码。此外,SWAP(& A,A)是一个简单的解决方案,但如果使用XOR TRAIL,则设置为0。C++是唯一的。他的问题也被标记为cYeah,但那是一种完全不同的语言。因为他显然是初学者,让我们帮助他学习C++,而不是让他困惑。这个帖子的标题是“……在C++中”,而不是在C中,它被除了OP之外的其他人所延迟,即使没有C是C的指示,也不是C++的任何指示。MSalters修正了这一点。但这并不能解决问题,至少在我读到的时候是这样。变量的地址应该改变,而不是值?谢谢你所有有价值的回答。我是
void swapPointers(int** first, int** second) {
int* temp = *first;
*first = *second;
*second = temp;
return;
}