使用指针作为参数

Min*_*Jia 3 c++ parameters pointers

我已经测试了下面的代码

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

a = 10
b = 5
Run Code Online (Sandbox Code Playgroud)

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

for*_*818 8

您的代码没有按照您的想法执行.要理解,请尝试编译:

void foo(int* x) {}

int main() { 
    int x = 42;
    foo(x);
}
Run Code Online (Sandbox Code Playgroud)

您将收到错误,因为您无法传递int给期望的函数int*.您的代码仍然有效

using namespace std;
Run Code Online (Sandbox Code Playgroud)

因为有一个std::swap(int&,int&)匹配你的电话(因此你不会看到swap你写的错误)和你的

 swap(a, b); 
Run Code Online (Sandbox Code Playgroud)

实际上调用标准函数.

把它作为一个教训,并尽量避免using namespace std;.这只是您使用它时可能遇到的一个问题.

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

void swap(int& x, int& y){
    int temp;
    temp = x; 
    x = y; 
    y =temp;
}
Run Code Online (Sandbox Code Playgroud)

但是,你不应该首先写一个swap,而是使用std::swap.