指针/引用参数 参数 指针的引用

4.2.3 指针/引用参数

在介绍指针/引用参数之前,先来介绍函数的传递方式。在C++中,函数参数主要采用两种传递方式:值传递和引用传递。所谓值传递是指在调用函数时将实际参数复制一份传递到函数中,这样,在函数中如果对参数进行修改,将不会影响到实际参数;而引用传递是指在调用函数时将实际参数的地址传递到函数中,那么,在函数中对参数所进行的修改,将影响到实际参数。

下面编写一个按值传递的函数OutputNumber,函数的作用是输出一个数值。

指针/引用参数 参数 指针的引用

例4.2 按值传递。(实例位置:光盘TMInstances4例4.2)

  1. voidOutputNumber(intnNumber)
  2. {
  3. cout<<nNumber<<endl;//输出数值
  4. nNumber=20;//修改参数
  5. }

在main函数中调用OutputNumber函数。

  1. intmain(intargc,char*argv[])
  2. {
  3. intnNum=10;//定义一个变量
  4. OutputNumber(nNum);//调用OutputNumber函数
  5. cout<<nNum<<endl;//输出变量值
  6. return0;
  7. }

运行程序,效果如图4.4所示。

从图4.4中可以发现,在OutputNumber函数中输出的 数值是10,尽管在该函数中将参数nNumber设置为20,但是在main函数中执行"cout<< nNum<<endl;"语句时,输出的结果仍为10。因为OutputNumber函数采用按值传递,对形式参数nNumber的修改不会影响到实际参数nNum。

如果修改OutputNumber函数,将参数的类型修改为引用类型,则OutputNumber函数将按引用方式传递。

图4.4 值传递

例4.3 按引用传递。(实例位置:光盘TMInstances4例4.3)

  1. voidOutputNumber(int&nNumber)//设置引用类型参数
  2. {
  3. cout<<nNumber<<endl;//输出结果
  4. nNumber=20;//修改参数值,将影响到实际参数
  5. }
  6. intmain(intargc,char*argv[])
  7. {
  8. intnNum=10;//定义一个变量
  9. OutputNumber(nNum);//调用OutputNumber函数
  10. cout<<nNum<<endl;//输出变量值
  11. return0;
  12. }

运行程序,效果如图4.5所示。

图4.5 引用传递

从图4.5中可以发现,在OutputNumber函数中将形式参数nNumber设置为20,实际参数nNum的值也为20。因为引用传递,传递的是参数的地址,对nNumber的修改自然会影响到nNum。

许多读者可能会问,如何判断函数是值传递还是引用传递呢?这需要根据参数的数据类型来判断,如果参数的数据类型是指针类型、引用类型或数组类型,则函数是引用传递,其他情况下是值传递。因此,不仅只有引用数据类型才是按引用传递,指针和数组类型参数同样是按引用传递。下面修改函数OutputNumber,采用指针作为函数参数。

例4.4指针作为函数参数。(实例位置:光盘TMInstances4例4.4)

  1. voidOutputNumber(int*pNumber)//使用指针作为函数参数
  2. {
  3. cout<<*pNumber<<endl;//输出参数值
  4. *pNumber=20;//设置参数值
  5. }
  6. intmain(intargc,char*argv[])
  7. {
  8. intnNum=10;//定义一个整型变量
  9. OutputNumber(&nNum);//调用OutputNumber函数
  10. cout<<nNum<<endl;//输出nNum
  11. return0;
  12. }

运行程序,效果与图4.5是相同的。

在编写函数时,如果函数需要采用引用方式传递,使用指针和引用作为参数类型都是可以的。使用指针和引用类型作为函数参数各有优缺点,视具体环境而定。对于引用类型,引用必须被初始化为一个对象,并且不能使它再指向其他对象,因为对引用赋值实际上是对目标对象赋值。这是引用类型的缺点,但也是引用类型的优点,因为在函数调用时需要验证引用参数的合法性。例如,如果函数OutputNumber采用引用参数类型,则语句"OutputNumber(0);"是非法的。如果函数OutputNumber采用指针类型参数,则语句"OutputNumber(0);"是合法的。因为0被认为是一个空指针,对空指针操作必然会导致地址访问错误。因此对于指针对象作为函数参数,函数体中需要验证指针参数是否为空。这是使用指针类型作为函数参数的缺点。但是,使用指针对象作为函数参数,用户可以随意修改指针参数指向的对象,这是引用类型参数所不能的。

  

爱华网本文地址 » http://www.aihuau.com/a/25101015/242253.html

更多阅读

函数指针及其应用 函数指针的应用

0推荐http://aoqingy.spaces.live.com/blog/cns!153c2d72af27eb1c!295.entryC语言专题(二):函数指针及其应用函数指针:函数的入口地址C程序变量驻留在程序内存空间的某个地址,它所在的地方取决于变量类型(自动变量、静态变量或全局变量等)

指向数组的指针和指向指针的指针 c语言指向数组的指针

指向数组的指针:很多人以为“指向数组的指针”就是“指向指针的指针”,于是有人写这样的代码:int a[3][4];int **p = a;//错误  这个代码的错误之处在于a是一个数组,它的成员也是数组,所以a叫做“数组的数组”——C++中严格说来没有二

二维数组与数组指针的用法 二维数组指针传递

二维数组与数组指针的用法 严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其它数据结构

C ++ 中对象或其对象指针的赋值 c语言指针赋值

C++中对象或其对象指针的赋值C++中成员函数的动态绑定:C++中要实现函数的动态绑定,必须在其基类中将函数声明为virtual且在子类中对函数加以实现。然后用一个基类指针指向某一个子类对象,这样才会在函数调用时实现动态绑定。在C++中,只

C指针的声明、赋值和基础操作 函数指针赋值

指针赋值:指针的初始化、赋值是同类型实体(即实体变量)的地址int i=10;int* ip=&amp;i (&amp;表示实体的地址)int* ipt=&amp;10是不可以的,10是实体,而不认可具有空间地址(所以说是实体变量地址才有效,也就是说将某一个const的变量赋值给指

声明:《指针/引用参数 参数 指针的引用》为网友花落冰层分享!如侵犯到您的合法权益请联系我们删除