函数传参的三种方式

来源:互联网 发布:淘宝店铺流失金额 编辑:程序博客网 时间:2024/06/05 14:56

C++函数传参有三种方式,分别是按指针传参,按引用传参,按值传参。以两个数据交换是否成功为例。

1.首先是按指针传参

源代码:

#include <iostream>
using namespace std;

void swap(int* n ,int* m) //按指针传参
{
    int temp;
    temp= *n;
    *n = *m;
    *m=temp;
}

int main()

{

int n=1,m=2;

cout<<"指针传参之前数据(两数未交换之前)"<<endl;

cout<<n<<"\t"<<m<<endl;

cout<<"全局函数指针传参之后数据(两数交换之后)"<<endl;

swap(&n,&m);

cout<<n<<"\t"<<m<<endl;

system("pause");

return 0;

}

运行结果:


从运行结果来看,两数交换成功,指针传参成功,传参原理说明,首先是全局函数main中将原两个数值的地址直接传到局部函数swap(int* n,int* m)中,在swap()函数中如何设置算法保证两数交换成功呢,首先是将swap(int* n,int* m),你可以把“*n”和“*m”看成是int类型,表示一个整形数值,在引入中间变量时temp可以直接定义为int类型,既可以用“*n”和“*m”对temp进行复制,即可保证是同一类,若将“n”和"m"赋值给temp则表示是赋地址,则就会出现数据交换不成功或者出现两个一样的数一个交换成功了,另一个没有交换成功或者程序算法有错。

2.引用传参

#include <iostream>
using namespace std;

void swap1(int& n1 ,int& m1) //按指针传参
{
    int temp;
    temp= n1;
    n1 = m1;
    m1=temp;
}

int main()

{

int n1=1,m1=2;

cout<<"引用传参之前数据(两数未交换之前)"<<endl;

cout<<n1<<"\t"<<m1<<endl;

cout<<"引用传参之后数据(两数交换之后)"<<endl;

swap1(n1,m1);

cout<<n1<<"\t"<<m1<<endl;

system("pause");

return 0;

}


从上述运行结果两数交换成功,引用传参是把原数的真实地址传进去,然后在全局函数main中传参成功。


3.数值传参


#include <iostream>
using namespace std;

void swap2(int n2 ,int m2) //按指针传参
{
    int temp;
    temp= n2;
    n2 = m2;
    m2=temp;
    cout<<"局部函数swap2()传参两数交换结果"<<endl;
    cout<<n2<<"\t"<<m2<<endl;
}

int main()

{
int n2=1,m2=2;
cout<<"全局函数数值传参之前数据(两数未交换之前)"<<endl;
cout<<n2<<"\t"<<m2<<endl;
swap2(n2,m2);
cout<<"全局函数数值传参之后数据(两数交换之后)"<<endl;
cout<<n2<<"\t"<<m2<<endl;
system("pause");
return 0;

}


从运行结果看,数值传参发生交换成功只发生在局部函数中,而全局函数中并没有交换成功,原因是数值参数只是把数值拷贝,而并没有将数的真正地址传进去,所以只发生在局部交换成功。

注1:C++中函数的传参分为引用型与非引用型,C++规定未使用“&”符号的都为非引用型,如数值和指针都属于非引用的,C++里能用引用的多用引用,非引用的都属于拷贝,拷贝浪费内存空间,而引用型的直接将地址传过去,不占用空间,所以多使用引用型。

注2:为了区分定义时是定义指针还是什么,一般这样子写比较好,如 int* n,就不要这样写 int *n。













0 0
原创粉丝点击