当前位置:   article > 正文

C++ 值传递、指针传递、引用传递_c++值参数传递指针参数传递和引用参数传递

c++值参数传递指针参数传递和引用参数传递

java只有值传递: java是按值调用(值传递)还是按引用调用(引用调用)
而C++有三种:

注意:每次调用一个函数,都会重新建立一个形参(类似于临时变量),传入的实参作为初始化值拷贝给形参 ,一旦实参的值拷贝给形参后,形参和实参其实是两个不同的对象了

1. 值传递

实参和形参都是变量名
这是传给形参的是变量的值,传递是单向的。如果执行函数期间函数形参数值发生变化,不回传给实参,因为在调用函数时候形参和实参不是同一个存储单元

调用时,将实参的值传递对应的形参,即为值传递。
由于形参有自己独立的存储空间,又作为函数的局部变量使用,因此在函数中对任何形参值得修改都不会改变实参变量的值。

当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

void swap(int ,int );
int main() {
	int a =1,b=2;
    swap(a,b);
    cout<< a<<b; // 输出1 2
}
void swap(int i,int j) {
	int temp;
    temp = i;
    i = j;
    j = temp;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

函数的调用过程:函数Swap被调用前,实参a和b有自己的存储空间,并且有自己的初始值。当调用函数Swap时,为形参(即函数的参数)i和j分配存储空间,并将a和b的值复制过来,函数执行过程中,将i和k的值进行交换,当函数执行结束之后,x和y所占用的存储空间将被释放,这种传递的方式,并不会对实参a和b的值产生影响,此即为值传递。

2. 指针传递

实参是变量地址,形参是指针变量
调用时候把a和b的地址传送给形参i和j(它们是指针变量),因此*a和i为同一内存单元,*b和j为同一内存单元
这种虚实结合的方法本质也是值传递,只是传递的值是变量的地址
可以改变指针指向的内容,不能改变指针指向
通过形参指针变量访问主函数中的变量a和b,并改变他们的值,这样就能得到正确的结果,但在概念上兜了一个圈子,并不是那么直截了当

形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

void swap(int *,int *);
int main() {
	int a =1,b=2;
    swap(&a,&b);
cout<< a<<b;
}

void swap(int *i,int *j) {
	int temp;
    temp = *i;
    *i = *j;
    *j = temp;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3. 引用传递

实参是变量名,形参是引用变量
传递的是变量的别名
虚实结合的时候将实参a的地址传递给形参j,让形参i的地址取实参a的地址,从而让a和i共享同一单元,简单来说:把变量a的名字传给引用变量i,让i成为a的别名

引用传递是一种特殊的变量,它被认为是一个变量的别名。当定义一个引用时,其实是为目标变量起一个别名,引用并不分配独立的内存空间,它与目标变量公用其内存空间,当定义一个引用时,如果该引用不是用作函数的参数或者返回值,则必须提供该引用的初始值(即必须提供引用的目标变量名)

说明:使用引用参数可以直接操作实参变量,从而能够实现通过修改形参的值而达到修改对应实参值得目的。当引用作为函数形参,其引用的目标变量为人为调用该函数时对应的实参变量名,所以,在定义函数时,对于引用类型参数不必提供引用的初始值

void swap(int &,int &);
int main() {
	int a =1,b=2;
    swap(a,b);
    cout<< a<<b; // 输出2 1
}
void swap(int &i,int &j) {
	int temp;
    temp = i;
    i = j;
    j = temp;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

当函数未调用之前,实参a和b的值分别为1和2。当函数调用过程中,形参的值被交换,即a=2,b=1;函数调用结束之后,实参的值被改变。即函数调用时,作为形参的引用变量并不分配新的内存空间,它将作为实参变量的别名与其共用内存。

4.其它

1. 引用传递和指针传递区别

引用的规则:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

2. 引用传递的优点

1.形参不必声明为指针变量
2.实参不必使用变量地址(在变量名前加&)

其它:
首先要搞清楚指针和引用区别。引用只是相当于一个变量的别名而已,并不是一个具体的对象,在内存中并不会分配空间。而指针是具体一个对象,声明一个对象时会在内存中为指针也分配空间。当普通变量作为形参传值时,只是将该变量的值传给函数,在函数内部不管如何变化都不会改变改变量的值。但是当引用传值时,在函数内部如果对形参做改变的话就会对该变量做改变,此时的形参相当于该变量的一个别名,对这个别名做出的改变就相当于对该变量做出改变。当指针作为形参向函数传值的时候是传的改变量的地址,所以在函数内部对该地址的内容做出改变就相当于对该变量的改变。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/算法研究专家/article/detail/63102
推荐阅读
相关标签
  

闽ICP备14008679号