1.引用
引用变量某个已存在变量的别名,一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向该变量
2.指针
指针是一个变量,它存储另一个变量的内存地址。指针可以在运行时被重新赋值,并且可以为空
3.区别
3.1引用必须赋初始值,指针可以不赋但不建议(因为可能会导致野指针问题)
引用不赋初始值是无法编译通过的
3.2引用只能指向一个变量从一而终
ref还是a的别名,没有变成b的别名
ref = b;并不是ref变成了b的别名,因为b本身就是一个值,所以这一步只是将b赋值给ref,同时因为ref是a的别名,所以a也修改了
3.3对引用赋值时对其指向的变量赋值,而并不是修改引用本身的值
int x = 5;
int &ref = x;
ref = 10; // x 的值被修改为 10
int x = 5;
int *ptr = &x;
*ptr = 10; // 通过解引用修改 x 的值为 10
3.4引用直接用对象的名字来访问所引用的对象,指针需使用解引用运算符 *
来访问指针所指向的对象
int x = 5;
int &ref = x; // ref 是 x 的引用
std::cout << ref << std::endl; // 直接访问 x 的值
int x = 5;
int *ptr = &x;
std::cout << *ptr << std::endl; // 通过解引用访问 x 的值
3.5引用没有自己的内存地址,它是所引用对象的别名。不能获取引用本身的地址,只能获取它所引用的对象的地址;指针有自己的内存地址,存储的是它所指向对象的内存地址。可以获取指针的地址,也可以获取它指向的对象的地址
int x = 5;
int &ref = x;
std::cout << &ref << std::endl; // 输出的是 x 的地址
int x = 5;
int *ptr = &x;
std::cout << ptr << std::endl; // 输出的是指针存储的 x 的地址
std::cout << &ptr << std::endl; // 输出的是指针本身的地址