c++ - 这个使用指针的交换函数有什么问题?

标签 c++ pointers

总的来说仍然是编程的菜鸟。我知道这段代码不起作用,但为什么?

void swap(int num1, int num2)
{ 
  int* p_first =& num1;
  int* p_sec =& num2;
  *p_first = num1;
  *p_sec = num2; 
}

最佳答案

该函数按值获取其参数,这意味着该函数仅对 num1num2 的临时拷贝进行操作。该函数修改这些值,然后在返回时丢弃临时值,并保留未更改的实际值。

解决此问题的惯用 C++ 方法是通过引用而不是值传递参数。

void swap(int &num1, int &num2) {
   auto temp = num1;
   num1 = num2;
   num2 = temp;
}

int x = 5, y = 7;
swap(x, y);

或者,您可以通过指针传递参数。这是惯用的 C 方法(因为 C 没有引用)。缺点是它强制调用者的代码传递其参数的地址,而不是参数本身。

void swap(int *num1, int *num2) {
   int temp = *num1;
   *num1 = *num2;
   *num2 = temp;
}

int x = 5, y = 7;
swap(&x, &y);

当然,要交换两个数字,最好的方法是不要重新发明轮子,而是使用已经为您编写的std::swap

int x = 5, y = 7;
std::swap(x, y);

关于c++ - 这个使用指针的交换函数有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37267699/

相关文章:

用于调用函数的 C++ 模板

c++ - 使用动态转换的 Lambda

c++ - 在 C++ 中对 vector 使用函数

c++ - 指向容器中元素的指针

c++ - 动态内存分配、指针成员和析构函数

c++ - QChar 如果 `isDigit()` 则获取数字值

c++ - 使用g++在linux中运行程序出错

c - 当我阅读 bsd 4.4 的核心代码时,无法处理似乎不必要的指针

c++ - 当前实例成员函数的函数指针

c# - 在 C# 中将结构体指针作为参数传递