众所周知,引用是某一个变量的别称。指针是一个变量,变量的内容是某一个变量的地址
下面从实现方式和应用两个维度剖析这两者的不同
指针的实现
指针从本质上来讲还是一个变量。和普通变量不一样的是:指针变量中存放的是其他变量的地址(变量都是需要占用存储空间的,有一个对应的地址)。
引用的实现
之前自己理解的引用不是变量。是在编译期间被编译器替换掉的一个符号,相当于是一个宏。这个理解是错误的。引用是一个变量,实现上可以把他当成一个不能改变其内容的指针。看下面代码的反汇编
源码:
#include <stdio.h》
#include <stdlib.h>
#include <string.h>
void func(int& a) {
a = 1;
printf("func a address:%p\n", &a);
return;
}
int main(int argc, char* argv[]) {
int mainA = 2;
printf("main mainA address:%p\n", &mainA);
func(mainA);
int & A = mainA;
A = 3;
printf("main A address:%p\n",&A);
return 0;
}
函数func对应的汇编代码
0804841d <_Z4funcRi>:
804841d: 55 push %ebp
804841e: 89 e5 mov %esp,%ebp
8048420: 83 ec