C++面向对象高级开发-03.指针与引用

指针与引用

背景知识
C语言中const修饰指针有三种情况:

  1. const修饰指针–常量指针,如:const int *p = &a; 特点:指针的指向可以修改,但是指针指向的数据不可以修改。
  2. const修饰常量–指针常量,如:int * const p = &a,const修饰常量,特点:指针的指向不可以改,指针指向的数据可以改。
  3. const即修饰指针,又修饰常量,如:const int * const p = &a; 特点:指针的指向和指针指向的数据都不可以改。

空指针用于初始化指针变量 int *p =NULL,不可访问。指针函数,指针作为形参时,传参使用&进行地址传递。

C++中的引用(取别名):
语法:数据类型 &别名 = 原名,如:int &b = a;
注意:引用必须初始化,引用初始化后不可以改变,引用后的赋值操作就是改变内存中的数据。

  1. 引用做函数传参,利用引用进行形参修饰实参,屏蔽指针。
  2. 引用做函数返回值,注意:不要返回局部变量的引用(栈区域局部数据不要返回),函数的调用可以作左值。

C++中的const引用,常简称为"常量引用". 常量引用的初始值可以是任意表达式,只要该表达式的结果能转换成引用的类型即可.,但是,对于字面值,一般表达式以及与常量引用类型不一致的对象作为常量引用的初始值,常量引用实际绑定到了临时变量上。

指针和引用的区别
注意:1处表示的是引用,2处表示的是取地址。
1.&(引用)==> 用来传值,出现在变量声明语句中位于变量 左边时,表示声明的是引用
2.&(取地址运算符) ==>用来获取首地址,在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时表示取对象的地址

  1. 引用在赋值=的左边,而取地址在赋值的右边
  2. 和类型在一起的是引用,和变量在一起的是取址
1const String& str;   // 此处的&表示引用
2this == &str;             // 此处的&表示取地址

区别:

  1. 首先,引用不可以为空,但指针可以为空。引用是对象的别名,引用为空——对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化。因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针;如果变量总是指向一个对象,你的设计不允许变量为空,这时你应该使用引用。
    而声明指针是可以不指向任何对象,也正是因为这个原因,使用指针之前必须做判空操作,而引用就不必。
  2. 其次,引用不可以改变指向,对一个对象"至死不渝";但是指针可以改变指向,而指向其它对象。说明:虽然引用不可以改变指向,但是可以改变初始化对象的内容。例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。
  3. 再次,引用的大小是所指向的变量的大小,因为引用只是一个别名而已;指针是指针本身的大小,4个字节(x86 32位),8个字节(x64 64位)
  4. 最后,引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)
    总结:指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。即引用的本质是在C++内部实现是一个指针常量(类型名 * const 变量)。,内部由编译器完成。

内存4区:栈区、堆区、全局区、代码区:
栈区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的等临时的值.
堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区城,该区域在程序结束后由操作系统释放
常量区:字符串常量和其他常量的存储位置,程序结束后由操作系统释放
代码区:存放函教体的二进制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值