第一次在CSND上写博文,和朋友们一起分享我的学习心得和体会。如果有哪里讲的不对或是有欠缺的地方,望朋友们不吝赐教!!
交流:csdn 或是 QQ 1414393882
好吧,今天我们就一起来讨论一下函数的参数传递,下面就通过几个简单的程序来谈谈~~ 开始咯!!
大家应该对“交换两个数”并不陌生吧,这也是很多教材作为讲解的经典例子,在此请允许我效仿一番,但我会加入自己的理解与不同的看法。。。
版本一
#include<iostream>
using namespace std;
int main(void)
{
int a = 10;
int b = 20;
int t;
t = a;
a = b;
b = t;
cout<<"a = "<<a<<", b = "<<b<<endl;
}
这个是最原始的版本了,可以达到交换 a 与 b 的值。此时 a = 20, b = 10
那么如果把交换两数的功能写成一个函数呢?
版本二
//这种方法称为值传递,就是在栈中会创建两个数的拷贝
#include<iostream>
using namespace std;
void swap(int a, int b)
{
int t;
t = a;
a = b;
b = t;
}
int main(void)
{
int a = 10;
int b = 20;
swap(a, b);
cout<<"a = "<<a<<", b = "<<b<<endl;
}
此时 a = 10, b = 20 首先main函数中的a ,b 与swap的形参a , b是互不影响的, 因为 main函数中的a ,b只作用于main函数中,有自己的一份内存空间;swap的形参a , b也有自己的一份内存空间,作用于swap函数,swap函数一结束,swap的形参a , b 就不存在了。所以输出的a , b依旧是main函数中的原来的a,b的值。
版本三
#include<iostream>
using namespace std;
void swap(int *p, int *q)
{
int *t;
t = p;
p = q;
q = t;
}
int main(void)
{
int a = 10;
int b = 20;
swap(&a, &b);
cout<<"a = "<<a<<", b = "<<b<<endl;
}
为了说明方便,我把形参中的a, b换成p, q;对程序结果完全不影响!!
此时的结果依然是 a = 10, b = 20 那为什么呢?
首先我们看到swap(&a, &b); 是取a , b各自的地址作为实参传递过去,形参p , q 也分配了内存空间,请看下面的表:
变量 内存地址 (假设) 变量的值
a 1001h 10
b 2001h 20
p 3001h 1001h (是a的内存地址)
q 4001h 2001h (是b的内存地址)
经过swap函数之后:
变量 内存地址 (假设) 变量的值
a 1001h 10
b 2001h 20
p 3001h 2001h (是b的内存地址)
q 4001h 1001h (是a的内存地址)
我们看到交换的只是p , q的值(p,q是指针变量,保存的是地址),所以根本对a, b没有任何影响~~~
版本四
//这种方法是通过指针来传递参数,编译器不会在栈中创建两个数的拷贝,是对a, b 原始值的操作
#include<iostream>
using namespace std;
void swap(int *p, int *q)
{
int t;
t = *p;
*p = *q;
*q = t;
}
int main(void)
{
int a = 10;
int b = 20;
swap(&a, &b);
cout<<"a = "<<a<<", b = "<<b<<endl;
}
此时的a = 20, b = 10 终于把两个数交换过来了~~来看看为什么?
我们来对swap函数中的语句进行分析:
t = *p; // p中保存的是a 在内存空间中的地址,*p 的值就是a 的值
*p = *q; // q中保存的是b 在内存空间中的地址,*q 的值就是b 的值
*q = t;
所以是对a, b 原始值的操作,就得到了我们想要的结果!!
把指针作为函数的接受参数虽然能够进行正常使用,但不易于阅读,难使用。那么来看看下面的方法~~~
版本五
//这种方法是通过引用来传递函数参数的;
//先说说引用是怎么回事吧!! 引用就是别名 语法是: 如 int &rnum = num; rnum就是num的别名,对rnum 操 作实际就是对num的操作。。
#include<iostream>
using namespace std;
void swap(int &p, int &q)
{
int t;
t = p;
p = q;
q = t;
}
int main(void)
{
int a = 10;
int b = 20;
swap(a, b);
cout<<"a = "<<a<<", b = "<<b<<endl;
}
此时的a = 20, b = 10
知道了引用是怎么回事后问题就简单了吧!! p 是 a 的别名 ; q 是 b 的别名 对p, q 的操作就是对a , b 的操作~~
如果你有更好的idea,欢迎交流!!
第一篇博文就这样完成了!!接下来有时间会继续跟朋友们探讨C++,以求共同进步!!