*在定义时使用代表指针类型,其他情况代表取内容。&在定义时使用代表引用(别名),在其他情况代表取地址

在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以值传递的方式传递给函数。这句话的意思是:被传递到函数的只是变量的值,永远不是变量的本身。

例如:

  1. void changeVar(int myVar,int newValue)
  2. {
  3. myVar=newValue;
  4. }
  5. int main(){
  6. int myNum=20;
  7. changeVar(myNum,90);
  8. std::cout<<myNum<<endl;
  9. return 0;
  10. }

结果为 20;

出现这种情况的原因是:在调用changeVar()函数时,程序只是把main()函数中的myNum变量的值赋值给了changeVar()函数中的myVar变量,它们是两个不同的变量。事实上,changeVar()函数完全不知道在main()函数中还存在一个myNum的变量,甚至连它的名字都不知道。

解决方法:

通过使用地址和指针

绕开“值传递”问题的第一个方法是向函数传递变量的地址而不是它的值。

  1. int main()
  2. {
  3. int myNum=20;
  4. changeVar(&myNum,90);
  5. }

当然,changeVar()函数也要相应的改动。代表送进来的参数是地址,改变的是该的地址存储的的内容

  1. void changeVar(int* myVar,int newValue){
  2. *myVar=newValue;  //* myVar 代表地址myVar对应的内容
  3. }

现在可以得到预期的结果90了。

这种交换在很多的排序算法里都要用到。

提示:有时候,向函数传递地址是让函数接收一个复杂数据类型的唯一方法。

以“引用传递”方式向函数传递参数

既然像这样使用地址是一种很好的思路,让这个概念更加完善岂不是更好?如果事先知道某个函数只能接受一个地址,能不能按照某种套路来编写有关的代码以便在调用该函数时不需要使用特殊的语法呢?

引入引用传递方式输入参数。

引用的定义

int a = 100;

int& b = a;

b = 1000;

考察: (1)&a与&b的关系? (2) a=?

b现在是a的一个别名! a=1000;

1)引用必须在声明时立即初始化,不允许空引用

2)引用一旦初始化,就不能再引用其它数据

3)引用和被引用的变量实际上代表同一个内存的数据

引用的主要功能

传递函数的参数和返回值.C++中常用的方式有三种

值传递,指针传递和引用传递

引用传递的性质象指针传递,书写形式象值传递,

理由:如果只需要借用一下别名,就没必要用指针,.

void changeVar(int &myVar,int newValue);

这个函数第一个输入的参数不是一个指针,它是那个将被传递给这个函数的原始变量的一个别名。在changeVar()函数里对这个参数变量进行的任何操作都将反映在changeVar()函数外的那个原始变量身上。这意味着changeVar()函数与原来的一样。

void changeVar(int myVar,int newValue){

myVar=newValue;

}

这使得这个函数更容易被调用----只需要提供一个变量名;

int main(){

int myNum=20;

changeVar(myNum,90);

}

这比值传参语法上更简单了。

以“引用传递”方式把参数值传递给一个函数是C++的新增功能,这可以让函数的调用语法更加简单清晰。

提示:1.在定义函数时,还可以让它以“引用传递”方式而不是以“值传递”方式返回: int &myFuntion();

2.除了可以改变有关变量的值,“引用传递”方式的另一个好处是它的开销相对要小一些:因为不需要在函数里创建临时变量来容纳那些值,程序的内存占用量当然会小一些。

3.如果想获得“引用传递”方式带来的性能改善,但不想改变某个变量的值,可以把相应的输入参数定义为一个常量:

void myFunc(const int &myNum);

通过这样定义的函数,可以把具体的参数直接传递给它:myFunc(7);

C/C++中函数参数传递详解(一)的更多相关文章

  1. C/C++中函数参数传递详解(二)

    昨天看了内存管理的有关内容,有一点了解,但不是很深入,发现之前写代码时有很多细节问题没有注意到,只知道这样做可以实现功能,却不知道为什么可以这样,对于采用自己的方法造成的隐患也未知,更不晓得还有其他方 ...

  2. go语言:函数参数传递详解

    参数传递是指在程序的传递过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程.比较常见的参数传递有:值传递,按地址传递参数或者按数组传递参数. 1.常规传递 使用普 ...

  3. 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏

    C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...

  4. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

  5. php中setcookie函数用法详解(转)

    php中setcookie函数用法详解:        php手册中对setcookie函数讲解的不是很清楚,下面是我做的一些整理,欢迎提出意见.        语法:        bool set ...

  6. 7--OC中NSLog函数输出格式详解

    OC中NSLog函数输出格式详解 • %@ 对象 • %d, %i 整数 • %u 无符整形 • %f 浮点/双字 • %x, %X 二进制整数 • %o 八进制整数 • %zu size_t • % ...

  7. delphi中Application.MessageBox函数用法详解

    delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...

  8. php中的PDO函数库详解

    PHP中的PDO函数库详解 PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力:与ADODB和MDB2相比,P ...

  9. OC中NSLog函数输出格式详解

    OC中NSLog函数输出格式详解 %@ 对象 • %d, %i 整数 • %u 无符整形 • %f 浮点/双字 • %x, %X 二进制整数 • %o 八进制整数 • %zu size_t • %p ...

随机推荐

  1. CodeIgniter配置之SESSION

    刚使用Codeigniter时也被其中的SESSION迷惑过,后来就再也没用过CI自带的SESSION,想必还是有必要整理一下SESSION.为弄清CI中的SESSION,先来说一下PHP中SESSI ...

  2. JDK环境变量安装正确还报错的情况解决方案

    环境变量 JAVA_HOME , PATH 都已配置完毕,并且 java -version也显示正确如下 E:\apache-tomcat-8.0.30-windows-x64\apache-tomc ...

  3. C++ Primer 第三章 标准库类型vector+迭代器iterator 运算

    1.vector: 标准库类型vector表示对象的集合,其中所有对象的类型都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它也常被称作容器( ...

  4. phalcon: 查找记录(Finding Records)可用的查询设置如下:

    可用的查询设置如下: 参数 描述 举例 conditions Search conditions for the find operation. Is used to extract only tho ...

  5. jquery函数

    1.ready函数 当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件. $(document).ready(function (){alert('11 ...

  6. Win7下Maven的安装与配置

    简介  官网:https://maven.apache.org/ Apache Maven,是一个(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供.基于项目对象模型(Pro ...

  7. 二级菜单jquery

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. OpenGL基础图形编程

    一.OpenGL与3D图形世界1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个充 ...

  9. git在公司内部的使用实践(转)

    从2011.10月左右,开始在后台组推行git版本控制,到现在也差不多半年了,也形成了一套基于git flow的副官模式工作流程: 版本定义: 版本号使用x.x.x进行定义,第一个x代表大版本只有在项 ...

  10. [转载]linux下svn常用指令

    一下内容转载于:http://blog.chinaunix.net/space.php?uid=22976768&do=blog&id=1640924.这个总结的很好~ windows ...