【问题标题】:Passing value to pointer parameters in C++将值传递给 C++ 中的指针参数
【发布时间】:2017-02-06 04:39:07
【问题描述】:

在下面的代码中,为什么交换函数以两种方式工作,将值传递为 swap(x,y) 和 swap(&x, &y)。

int main(){

   int x, y;

   cout << "Enter the values of x and y: ";
   cin >> x >> y;

   swap(x, y);

   cout << "\nSwapped values are, x: " << x << " & y: " << y <<"\n";

   return 0;

}

void swap(int *a, int *b){

   int s;
   s = *a;
   *a = *b;
   *b = s;

}

【问题讨论】:

  • 避免使用using namespace std; 语句,您就不会遇到这些陷阱。
  • 始终发布您的minimal reproducible example。你有using namespace std,但没有在这里显示。忽略包含关键细节会浪费我们的时间!!
  • 请在您的using namespace std#includes 中编辑。
  • 你的函数应该被称为 ::swap(&ax, &y)。
  • ::swap(&x, &y) 当然...

标签: c++ pointers parameter-passing


【解决方案1】:

当你写swap(x, y);时你打电话给std::swap


在您的示例中,即使您编写了swap(&amp;x, &amp;y);,也只会出现编译错误,除非您在main 之前声明void swap(int*,int*);

std::swap 对此无能为力,因为它无法将右值int* 转换为int*&amp;。 (即使它可以做到这一点,它也不会交换xy的值)


【讨论】:

  • 这只是一个没有帮助的真实陈述。为了提供有用的答案,您应该解释std::swap 是什么、为什么调用它以及如何解决问题。
  • @anatolyg 这不是 OP 所要求的,如果 OP 在这方面遇到问题,请提出另一个问题或查看一些参考资料(或在评论中提问)。在 OP 请求(以及与 this 问题相关)之前,我不会添加更多细节。
  • 也许 OP 只是忘记了std::swap,谁知道呢?
【解决方案2】:

这是另一个答案的解释,关于为什么调用std::swap

当您swap(x, y) 时,编译器会尝试查找要调用的swap 重载。假设您编写了using std::swap;using namespace std;,则允许编译器查看的命名空间将是全局的和std

原型void swap(int, int) 是预期的,但编译器对选项开放——具有相同名称、相同参数数量但需要强制转换的不同参数类型的函数也可以——在寻找可行的重载时;枚举完之后,它会选择最接近的匹配。

你在全局命名空间中实现的类型是

void swap(int*, int*);

但是standard library header &lt;utility&gt; 给出的是一个函数模板

namespace std {
    template <typename T>
    void swap(T&, T&);
}

由于T = int,此重载变为void swap(int&amp;, int&amp;)。现在这是一个身份匹配(不需要类型强制),因此 赢得了 重载决议。

如果您没有编写using std::swap;using namespace std;,那么编译器唯一可能的重载将是您的,您会收到一个错误,指出参数类型不匹配。修复它将修复调用代码以传递int*(这些变量的地址是指向int的类型指针)而不是int

swap(&x, &y);

【讨论】:

    【解决方案3】:

    当您调用版本 swap(x,y) 时,它实际上调用了标准库函数模板“template void swap (T& a, T& b)” , 在“算法”头文件中声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2012-01-24
      相关资源
      最近更新 更多