指针:存储地址的变量,指向内存的一个存储单元,指针是实体
引用:变量的别名,和原来的变量本质上是同一个东西
相同点:
- 都是地址的概念(一个是某块内存的地址,一个时某块内存的别名)
不同点:
- 存在常量指针,不存在常量引用
- "sizeof(引用)"得到的是所指向对象的大小,而"sizeof(指针)"得到的是指针本身的大小
- 两者的自增运算符意义不同
- 引用在定义时必须初始化,并且不能再被改变
- 指针可以为空
- 指针可以有多级,但是引用只能是一级(例如"int **p"合法,"int &&a"不合法)
- 引用是类型安全的,而指针不是(引用比指针多了类型检查)
指针与引用的函数传递:
指针传递的本质上是值传递,值传递过程中被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数传进来的实参的值,从而成为了实参的一个副本,值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值(当然这里的实参变量指的是指针变量,而不是指针所指内存上的值)
而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但这时存放的是由主调函数放进来的实参变量的地址,被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量,因此被调函数对形参做的任何操作都会影响主调函数中的实参变量