c++中有哪些传参方式

  介绍

本篇文章为大家展示了c++中有哪些传参方式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

值传递

我们都知道,在函数定义括号中的参数是形参,是给函数内专用的局部变量,意味着函数接收到的是实参的副本,如果形参的值在函数内部被改变,<强>对实参是没有影响的

 # include  & lt; iostream> using  namespace 性传播疾病;void 改变(int  formalNum), {
  时间=formalNum  0;cout  & lt; & lt;,“formalNum 地址:,“,& lt; & lt;,, formalNum  & lt; & lt;, endl;
  }int  main (), {int  realNum =, 10;cout  & lt; & lt;,“Before 改变:,“,& lt; & lt;, realNum  & lt; & lt;, endl;cout  & lt; & lt;,“realNum 地址:,“,& lt; & lt;,, realNum  & lt; & lt;, endl;
  改变(realNum);cout  & lt; & lt;,“After 改变:,“,& lt; & lt;, realNum ;return  0;
  }//,执行结果Before 改变:,10 realnum 地址:008 ffda0
  formalNum 地址:008 ffccc
  After 改变:10 

可以看见,实参和形参的地址完全不一样,而且函数完全没有办法改变实参的值。<强>值传递的作用更多是让函数内部了解外部参数的值。<强>值传递是单向的,只能由实参传向形参。

指针传递

指针传递很好理解,形参为指向实参地址的指针,当对形参操作时,等同于直接通过地址操作实参。

 # include  & lt; iostream> using  namespace 性传播疾病;void 改变(int  * ptr), {
  * ptr =, 0;
  }int  main (), {int  realNum =, 10;int *, ptr =,, realNum;cout  & lt; & lt;,“Before 改变:,“,& lt; & lt;, realNum  & lt; & lt;, endl;
  改变(ptr);cout  & lt; & lt;,“After 改变:,“,& lt; & lt;, realNum ;return  0;
  }// 执行结果Before Change: 10After Change: 0

可以很明显地看见,我们在函数内部成功地修改了实参的值。是C++很常见的一种传参方式。

引用传递

引用传递其实是最难理解的一种传参方式。在详细剖析它之前,我们先说他的功能。

向函数传递参数的引用调用方法,把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

那么肯定有人问了,既然都是直接影响,指针和引用有啥区别呢???那区别可大了去了。

  1. 指针从本质上是一个变量,是一个整形变量,存放的是另一个变量的地址。指针在逻辑上是独立的,它可以被改变,甚至能改变它的值(指向其他地址),并且可以取出对应内存中的数据。

  2. 引用可以理解为外号,是另一个变量的同义词,它在逻辑上具有依附性,所以C++也规定引用的在创立的时候就必须被初始化(现有一个变量,然后创建对该变量的引用)。而且其引用的对象在其整个生命周期中不能被改变,即自始至终只能依附于同一个变量(初始化的时候代表的是谁的别名,就一直是谁的别名,不能变)。

  3. 在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

引用的规则:

  • 引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

  • 不能有NULL引用,引用必须与合法的存储单元关联(指针可以有野指针,可以指向NULL)。

  • 一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

看了这么多,指针传递引用传递的用处是什么呢?

  1. 函数内部修改参数并且希望改动影响调用函数。对比指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改);

  2. 当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递。

    c++中有哪些传参方式