函数值传递、地址传递、引用传递,指针与引用

1.值传递:
有一个形参向函数所属的栈拷贝数据的过程,如果值传递的对象是类对象或是大的结构体对象,将耗费一定的时间和空间。
函数返回后,函数栈帧销毁,拷贝也会自动被回收,所以值传递对形参的操作不会影响原来的值。
2.指针传递:
同样有一个形参向函数所属的栈==拷贝==数据的过程,但拷贝的数据是一个固定为4字节的地址(32位系统,64位为8字节)。
传指针就是为实参创建一个指针变量,指针变量里面存的就是实参的地址,
对形参进行操作也会通过指针的间接访问对实参进行修改,所以指针传递对形参的操作会影响原来的值。
3.引用传递:
传引用什么也没创建,只是给实参取了个别名,就像同学之间取外号一样,张三是这个同学,铁蛋也是这个同学,两个名字可是指的就是一个人,
对引用进行操作就等于对实参的操作,对引用的操作会影响原来的实参。
效率上讲,指针传递和引用传递比值传递效率高。指针传递和引用传递都会改变实参的值,而值传递不会。
一般主张使用引用传递,代码逻辑上更加紧凑、清晰。
但引用传递做函数参数”是C++的特性,C语言不支持。还需要注意引用必须初始化。

指针和引用区别:

(1)非空区别
在任何情况下都不能使用指向空值的引用,一个引用必须总是指向某个对象
因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你就可以赋空值给该指针变量
相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高

(2)合法型区别,
在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空

(3)可修改区别
指针与引用的一个重要区别是指针可以被重新赋值以指向另一个不同的对象
但是引用则总是指向在初始化时被指向的对象,以后不能改变,但是指定的对象其内容可以改变

(4)应用区别
在以下情况下使用指针:
一是考虑存在不指向任何对象的情况用指针(这种情况下,能够设置指针为空),

二是需要能够在不同时刻指向不同的对象用指针(在这种情况下,你能改变指针指针的指向)

如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么应该使用引用

(5)其他区别:

1)引用在定义时必须初始化,指针没有要求
2)没有NULL引用,只有NULL指针
3)在sizeof中含义不同,引用是引用类型的大小,指针始终是地址空间的字节大小
4)引用自加改变变量的内容,指针自加改变了指针的指向
5)有多级指针但没有多级引用
6)引用比指针用起来相对更安全

应用场景:

应用一:针对函数内部 只使用传递的值 而不做修改

a.数据对象较小,如内置数据类型或小型结构体,则按值传递

void func(int a);

b.数据对象是数组,则只能使用指针,并将指针const

void func(const int *A,int size);//第二个参数为数组长度

c.数据对象是较大的结构体,则const指针或const引用都行

struct struc{};
void func(const struc *);
void func(const struc &);

d.数据对象是类,则使用const引用

void func(const string &,);

应用二:针对函数内部 不仅使用传递的值且要做修改的情况

a.数据对象是内置数据类型,则使用指针

void func(int *);

b.数据对象是数组,则只能使用指针

void func(int *,int);//第二个参数为数组长度

c.数据对象是结构体,则使用引用或指针

struct struc{};
void func(struc *);
void func(struc &);

d.数据对象是类,则使用引用

void func(ostream &)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值