Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 交换C+中指针的地址+;_C++_Pointers - Fatal编程技术网

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