C++按值/按址传递

1.按值传递:

#include <iostream>
using namespace std;

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

int main()
{
    int a,b;
    a=3;
    b=4;
    cout<<"a:"<<a<<'\t'<<"b:"<<b<<endl;
    swap(a,b);
    cout<<"a:"<<a<<'\t'<<"b:"<<b<<endl;

    return 0;
}

2.按址传递:

#include <iostream>
using namespace std;

void swap(int *x, int *y)
{
    int z=*x;
    *x=*y;
    *y=z;
}

int main()
{
    int a,b;
    a=3;
    b=4;
    cout<<"a:"<<a<<'\t'<<"b:"<<b<<endl;
    swap(&a,&b);
    cout<<"a:"<<a<<'\t'<<"b:"<<b<<endl;

    return 0;
}

因为C++中有了指针的概念,所以在讲述按值/按址传递函数参数比其他语言(VB使用ByRef关键字、C#使用ref关键字)好理解多了,按值传递的是副本,按址传的是内存地址。但是,使用指针,swap函数中有的变量有星号,有的变量没星号,很容易就弄混输错了,我们可以改用别名传递来实现同样的效果:

#include <iostream>
using namespace std;

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

int main()
{
    int a,b;
    a=3;
    b=4;
    cout<<"a:"<<a<<'\t'<<"b:"<<b<<endl;
    swap(a,b);
    cout<<"a:"<<a<<'\t'<<"b:"<<b<<endl;

    return 0;
}

swap函数的形参是实参的别名,别名等同于原本的变量,不再是副本,因而也能实现按址传递的效果,并且代码也变简单多了。

评论: 0 | 引用: 0 | 查看次数: 4037
发表评论
登录后再发表评论!