为什么使用指针
- 每一个编程语言都使用指针(C++将指针暴露给程序员 而java等其他语言将指针隐蔽起来)
- 指针能够有效的表示数据结构
- 能动态分配内存,实现内存的自由管理
- 能方便的使用字符串
- 指针直接与数据的存储地址有关
值传递不如地址传递高效,因为值传递先从实参的地址中取值,再赋值给形参代入函数计算。而指针则把形参的地址直接指向实参地址,使用时直接取出数据,效率提高
指针和引用的区别
本质
- 引用是别名
- 指针是地址
具体
现象:
指针可以在运行时改变所指向的值,而引用一旦与某个对象绑定之后就不能再改变。指针可以被重新赋值用来指向另一个对象,但是引用则总是在初始化时被指定的对象,以后不能改变,但是指向的内容可以改变
string str1 = "a";
string str3 = "b";
string &str2 = str1;
str2 = str3;
str2是str1的别名 已经映射了str1的地址 不能再映射其他的地址 不能作为其他变量的别名了
内存分配:
程序为指针变量分配内存区域,而不为引用分配内存区域。因为引用声明时必须初始化从而指向之歌已经存在的对象,引用不能为空值
编译
程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表声称之后就不会再改,因此指针可以改变指向的对象,而引用对象不能改。这是使用指针不安全而使用引用安全的主要原因。某种意义上引用可以被认为是不能改变的指针。
理论
指针没有级数限制 但是引用只有一级
效率
两者的效率是一致的,因为在底层中,指针和引用的参数都指向同一个地址
用*传参可能会指向空的地址或者错误的地址,所以要时时判断参数是否为空,导致降低效率 而用&传参,则参数不可能为空或者错误地址。
其他
对引用使用sizeof得到的是变量的大小 而对指针使用得到的是变量的地址的大小
++操作,对引用的操作直接反应到所指向的对象,而不是改变指向,而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。