什么是指针?
(及格回答方式) 指针的定义 type* type 为类型 任何类型都可以定义成指针 指针本身也是一种数据类型 它用于保存各种数据类型在内存中的地址
什么是引用?
(及格回答方式) 引用定义 type& type为类型 引用定义就必须被初始化 引用表示一个变量别名 对它的任何操作 就相当于对变量本身操作 所以说引用也是指针 是一种特殊的指针
源程序如下 :
#include<iostream>
int main(){
int a =666;
int* b = &a;
int& c =a;
return 0;
}
汇编代码:
int a = 666;
//dword ptr 双字(四个字节) 将666放入[a]局部变量内存单元 此时栈中局部变量a=666
01041832 mov dword ptr [a],29Ah
int* b = &a;
//lea指令 将a指向的内存单元放入eax寄存器 此时的eax寄存器存储了 变量a的地址 eax = a的地址
01041839 lea eax,[a]
//mov指令 将eax的地址移动 栈中局部变量b (因为上面已经a的内存单元放入eax寄存器了) 那么也就是说b的地址存储了a的地址值 看到这里应该彻底明白什么是指针了吧
0104183C mov dword ptr [b],eax
int& c = a;
----------------------------------------引用操作--------------------------------------------
//将局部变量a指向内存单元 放入eax寄存器
0104183F lea eax,[a]
//如同上 将a的地址放入栈中的局部变量C 现在明白了 引用就是一个特殊的指针 他是有地址的 只是不能操作而已 编译器帮我维护的指针
01041842 mov dword ptr [c],eax
return 0;
总结:
指针和引用类型的储存方式是一样的 都是内存空间存放地址值 所以 在c++中 指针和引用没有分别 引用通过编译器寻址 也就是编译器帮我们维护 而指针 需要手动寻址 操作失误将产生严重的后果
C++提倡优先使用使用引用
面试官:
有了指针为什么还需要引用?
答:为了支持运算符重载看起来好看一些
有了引用为什么还需要指针?
答:为了兼容C语言
说说他们的相同点?
答:理论他们都是指针 都可以直接修改引用的值或指向的值
不同点?
1:引用创建必须初始化 而指针可以不用初始化
2: 引用永远指向他初始的那个值 而非const顶层指针指向地址可以随意修改
各自优点?
指针比较灵活 只要是非const顶层指针指向地址都可以随便改 但是坑多 比如空指针野指针 未初始化就用 值被改变还用
而引用就不存在上面的问题 他的优点就是他缺点 不够灵活
添加老丁微信 建立程序员圈子