1. 指针和引用区别:
指针:
- 指向一块内存,它的内容是所指内存的地址,使用过程中可以更改被指内存的内容;
- 指针可以为空,可以在使用过程中指向其它地址,(不专心);
引用:
- 某块内存的别名,在使用过程中引用不可以改变指向(虽然引用不可以改变指向,但是可以改变初始化对象的内容)。
- 定义一个引用的时候,必须初始化,要不然编译报错。
在指针和引用传递参数时,一般选则引用会比较安全一些,因为引用被初始化后就不能被更改了。当然也可以使用const指针
int *const p:指向int类型的const指针,指针不能更改,编译阶段会报错
const int*p:指向const变量的int*指针,指针的值可以更改,但是指针所指的内存是无法修改的。
如下形参是const指针,其指向是无法修改的,
void print_value(int* const a){
*a = 666; //a是aaa的别名,相当于修改了aaa。
//int b = 444;
//a = &b;
}
引用例子示范:
从上面的运行的结果看,虽然引用是一个别名,操作别名,就相当于操作原始变量。如上面引用变量地址和原始变量一致。
2.引用占用内存吗
基于VS2010反汇编的结果来看,引用是申请内存的
0005154E push 3
00051550 push 2
00051552 push 1
00051554 lea ecx,[t1] #取出ti对象地址到ecx寄存器。
00051557 call `wmain'::`2'::t_demo::t_demo (515D0h)
36: t_demo &ref_t1 = t1; //这里定义引用ref_t1
0005155C lea eax,[t1] #取出ti对象地址到eax寄存器。
0005155F mov dword ptr [ref_t1],eax //这里将t1对象地址,保存到ref_t1指向的内存中
37: t_demo *t1_addr = &ref_t1;
00051562 mov eax,dword ptr [ref_t1] //将ref_t1指向内存的内容,保存到eax中
00051565 mov dword ptr [t1_addr],eax //将t1保存到t1_addr指向的内存中。
38: int size_ref_t1 = sizeof(ref_t1);
00051568 mov dword ptr [size_ref_t1],0Ch
39: return 0;
0005156F xor eax,eax
40: }
上面最重要的就是下面2行代码,如果ref_t1,不申请内存的话,那么第二行赋值语句肯定是要报错的。探索到这里,分析引用到底占不占用内存,也没多大意义。一般引用变量是局部变量,使用之后不久就要释放了。(网上也有人讨论引用是不占用内存)
0005155C lea eax,[t1] #取出ti对象地址到eax寄存器。
0005155F mov dword ptr [ref_t1],eax //这里将t1对象地址,保存到ref_t1指向的内存中
反汇编运行代码
上面监听能看到,引用地址和对象地址都是一样的。但用sizeof去计算引用对象大小时,和其引用对象大小是一样的。