使用指针作为参数

时间:2018-12-13 10:16:21

标签: c++ pointers parameters

我已经测试了以下代码

#include <iostream>
using namespace std;
void swap(int *x, int *y);

int main() {
    int a, b;
    a = 5;  
    b = 10; 
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "&a = " << &a << endl;
    cout << "&b = " << &b << endl;

    swap(a, b); 
    cout << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    return 0;
}

void swap(int *x, int *y){
    cout << "Hello" << endl;
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;
    int temp;
    temp = *x; 
    *x = *y; 
    *y =temp;
}

我知道它应该通过&a和&b进行交换,并且可以按预期工作。 但是,上述代码似乎也可以工作。结果是:

a = 5
b = 10
&a = 0x7ffeea1648d8
&b = 0x7ffeea1648d4

a = 10
b = 5

问题是:
如果实现了交换功能,为什么没有打印出任何信息?
如果未实现交换功能,为什么要交换值?

1 个答案:

答案 0 :(得分:8)

您的代码没有按照您认为的做。要了解,请尝试将其编译为:

void foo(int* x) {}

int main() { 
    int x = 42;
    foo(x);
}

由于无法将int传递给需要int*的函数,将导致错误。由于

,您的代码仍然有效
using namespace std;

并且因为有一个std::swap(int&,int&)与您的通话相匹配(因此您不会看到所写的swap的错误)和

 swap(a, b); 

实际上调用标准函数。

将其作为课程,并尝试避免使用using namespace std;。这只是使用时可能遇到的一个问题。

此外,我建议您使用引用而不是指针。指针可以为null,但是如果函数的参数之一为null,则交换任何内容都没有意义。通过引用,代码看起来更好(主观很好,但也许您可以同意):

void swap(int& x, int& y){
    int temp;
    temp = x; 
    x = y; 
    y =temp;
}

但是,您不应该首先编写swap,而应使用std::swap