C++: 引用和指针
jwenjian opened this issue · 0 comments
jwenjian commented
C++ 引用 vs 指针
引用很容易与指针混淆,它们之间有三个主要的不同:
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
最开始被例子中的注释// error,引用不能换了
给误导, 以为这样写的话, 编译器就会报错而无法运行, 其实不然.
引用不能指向另外一个对象的意思是, 如果一个引用初始化时指向对象a, 那么对该引用再次赋值成对象b就相当于给对象a再次赋值, 其值为对象b的地址对应的值, 而不是将该引用指向对象b
int var_a = 1;
int& ref_var_a = var_a;
int var_b = 2;
此时执行ref_var_a = var_b;
, 相当于执行var_a = var_b;
通过下面这段代码和output会更加明显.
#include <iostream>
int main()
{
int var_a = 1;
int& ref_var_a = var_a;
int var_b = 2;
std::cout << "var_a = " << var_a << std::endl;
std::cout << "var_a's address = " << &var_a << std::endl;
std::cout << "ref_var_a = " << ref_var_a << std::endl;
std::cout << "ref_var_a's address = " << &ref_var_a << std::endl;
std::cout << "var_b = " << var_b << std::endl;
std::cout << "var_b's address = " << &var_b << std::endl;
ref_var_a = var_b;
std::cout << "========== ref_var_a = var_b =======" << std::endl;
std::cout << "var_a = " << var_a << std::endl;
std::cout << "var_a's address = " << &var_a << std::endl;
std::cout << "ref_var_a = " << ref_var_a << std::endl;
std::cout << "ref_var_a's address = " << &ref_var_a << std::endl;
std::cout << "var_b = " << var_b << std::endl;
std::cout << "var_b's address = " << &var_b << std::endl;
}
对应的output如下:
可以看出:
ref_var_a
的地址在执行ref_var_a = var_b
前后始终没变: 0015F8A8var_a
的地址对应的值在ref_var_a = var_b
之后变成了var_b
的地址对应的值: 2- 由于
var_a
的值发生了变化, 而ref_var_a
指向var_a
, 所以之后ref_var_a
的值也变成了2