函数参数传值、传引用和传指针的区别

系列文章目录

前言

在C和C++开发中,主要会用到不同的函数参数传递形式

一、函数参数传值、传引用和传指针的区别分别是什么?

指针是一种数据类型,指针和其他整形、浮点型等变量没有什么区别,只不过其他变量比如整型变量,它的变量数值一般是个整数,比如1,2等;但是指针的变量数值是一个地址而已。

传值:将实参传给形参,赋值完后实参和形参没有任何联系了,因此形参的改变对实参没有影响。

传地址:是把实参的地址传给形参,这也形参的改变就会影响到实参。因为形参和实参对象指向的地址是一样的,所以因此形参指向的对象就是实参的对象。传地址本质也是值的传递,传的是地址,值传递特点是被调函数对形式参数的任何操作都是作为局部变量来进行的,不会影响到主调函数的实参的值,但是因为传的是地址,因此其实也在改变了这个地址上的变量。形参和实参实际是相互独立的。因为是传地址,如果对传进来的指针进行++操作,则不再能改变实参的值,所以因此很多传递指针的时候会用const进行修饰。int* const n

传引用:没有任何拷贝,就是两个变量直接指向同一个对象,形参相当于是实参的林外一个别名,因此形参改变,实参也改变。传指针穿的是一个变量值,本质是值传递,而传引用,传进来直接是一个地址,因此形参被当作间接寻址。所以对形参的操作都影响实参。但是实际我认为本质就是传指针有可能可以对传进来的指针变量的地址改变了,则形参不再影响到实参,但是传引用则直接只能对实参进行作用。

在符号表上(变量名、变量地址),传引用和传指针的不同。
传指针:在符号表上,变量地址为指针这个变量的地址。
传引用:在符号表上,变量地址直接为引用对象的地址值。(比如整数3在内存的地址)
符号表生成后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。

指针和引用的相同点和不同点:

★相同点:

●都是地址的概念;

指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

★不同点:

●指针是一个实体,而引用仅是个别名;

●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;

●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)

●引用不能为空,指针可以为空;

●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;

●指针和引用的自增(++)运算意义不一样;

●引用是类型安全的,而指针不是 (引用比指针多了类型检查)

猜你喜欢

转载自blog.csdn.net/qq_43614246/article/details/121761260