在C ++中将值传递给指针参数

时间:2016-09-28 09:32:25

标签: c++ pointers parameter-passing

在下面的代码中,为什么交换函数以两种方式工作,通过将值传递为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;

}

3 个答案:

答案 0 :(得分:7)

您在撰写std::swap

时致电swap(x, y);

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

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

答案 1 :(得分:6)

以下是另一个答案的解释,关于调用std::swap的原因:

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

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

您在全局命名空间中实现的类型为

void swap(int*, int*);

standard library header <utility>给出的是函数模板

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

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

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

swap(&x, &y);

答案 2 :(得分:2)

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