函数参数传递,一二事

摘要:简要比较了直接、指针、引用三中函数参数传递方式,并对其优缺点进行了大致的说明

1. 众所周知,函数参数的直接传递就是实现一个拷贝值,这个拷贝值的变化,并不会改变原值的变化,因为两个被来就是不同的个体,就好比两个克隆的个体,虽然两者之间有很多相同的地方,但是它们的思维是独立的。

2. 通过指针的方式给函数参数传值呢,从根本上来讲,它仍然是直接传值,但是这个拷贝的值比较特殊,是一个地址罢了,如:

   1: void fun(int *pnValue)
   2: {
   3:     ...;
   4: }
   5: int main()
   6: {
   7:     int nValue = 6;
   8:     fun(&nValue);
   9: }

它其实是将nValue的地址拷贝给了pnValue,如果在fun函数中,一开始就将pnValue的值给改变,如pnValue=&nValue2,那么pnValue指向的内容的改变,将不会影响到nValue。

同时有一点需要注意的是,空指针对象是没有意义的,会引起程序的奔溃,因此在开始因该进行检测,if(!pnValue) return;

通过指针传参数的优点:

1) 允许你改变传递的参数的值

2) 由于它拷贝的仅仅是一个字节大小的地址,因此传递的过程是快速的,特别对于较大的结构或是类

3) 我们通过这种传参方式,获取从函数中返回的多个量

缺点:

1) 传递的只能是普通的变量,不能是字面常量或表达式

2) 所有的传递值都得检查是不是空指针

3. 通过引用的方式传递参数

虽然在底层的操作中,通过引用也是通过“指针的方式”进行实现的http://blog.csdn.net/wanwenweifly4/article/details/6739687),但是从语言上考虑,引用是对象的别名,也是一个对象,并不是指针,因为它的概念是在语言上定义的,而不是底层的实现方式,换一种思维,抛开所有的比汇编语言高级的语言,回到汇编语言建立初期,单单从汇编语言上考虑,那时有没有指针的概念呢?因此应该理性的对待引用在C++语言中的概念,也应该冷静的认识它在底层中的实现方式,区分的对待,其实也不用争执于这个问题,认清了,会用了,就成了。(这些仅个人见解,批判的看待吧)。

它在传参中的优点:

1) 允许你改变传递的参数的值

2) 传递的过程是快速的,特别对于较大的结构或是类

3) 可以通过添加一个const,避免不经意的改变

4) 我们通过这种传参方式,获取从函数中返回的多个量

缺点:

1) 非const类型的参数,传递的只能是普通的变量,不能是字面常量或表达式

2) 不容易区分哪些变量是input,需要output,或都是

3) 通过函数的调用,很难看出那个参数是将被改变的,因为它和直接传值的方式相同,只能通过函数原型进行辨认,当程序员不小心忽视的时候,可能会导致错误的发生

 

ps:

   1: #include <iostream>
   2:  
   3: int nFive = 5;
   4: int nSix = 6;
   8: void SetToSix(int *pTempPtr);
   9:  
  10: int main()
  11: {
  12:     using namespace std;
  13:  
  16:     int *pPtr = &nFive;
  19:     cout << *pPtr;
  20:  
  23:     SetToSix(pPtr);
  27:     cout << *pPtr;
  28:  
  29:     return 0;
  30: }
  31:  
  33: void SetToSix(int *pTempPtr)
  34: {
  35:     using namespace std;
  36:  
  38:     pTempPtr = &nSix;
  41:     cout << *pTempPtr;
  42: }

上面这个程序中输出的结果是 565

如果想使得输出的结果为566呢,有一个方法可以实现,就是采用指针的引用,如下:

   1: // pTempPtr is now a reference to a pointer to pPtr!
   2: // This means if we change pTempPtr, we change pPtr!
   3: void SetToSix(int *&pTempPtr)
   4: {
   5:     using namespace std;
   6:  
   7:     pTempPtr = &nSix;
   8:  
   9:     // This will print 6
  10:     cout << *pTempPtr;
  11: }

posted on 2012-05-23 22:16 钟谢伟 阅读(1377) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(1)

随笔档案

IT网站

My Friends

搜索

最新评论

阅读排行榜

评论排行榜