函数传参的三种方式
2015-11-16 11:40
232 查看
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。
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。
相关文章推荐
- Gradle 使用Jetty插件启动web项目时出现"java.lang.OutOfMemoryError: PermGen space"解决方法
- Linux strace命令
- SpringMVC拦截器实例
- Hotseat栏增加滑动功能
- Camera 施工中
- zimbra全局地址显示不全和galsync账户删除后的问题解决
- 单例模式
- P2P通讯协议定义说明书
- LoadRunner Mysql性能优化
- printf("%d",5.01)和printf("%f",5)的输出结果
- 确定天数
- 学习笔记 - 关于Ruby
- 使用ThreadLocal变量的时机和方法
- 循环队列
- LoadRunner错误处理函数
- 第四天-secureCRT-ssh客户端使用详解
- 微软云的新体验,azure remoteIE(私用)
- 仿滴滴打车底部滑动条代码逻辑实现
- 完美网络
- orcle 序列