jwenjian/ghiblog

C++: 引用和指针

jwenjian opened this issue · 0 comments

C++ 引用 vs 指针
引用很容易与指针混淆,它们之间有三个主要的不同:

  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。

对于第二个不同点, 网上举了很多例子, 比如:
image

最开始被例子中的注释// 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如下:

image

可以看出:

  1. ref_var_a的地址在执行ref_var_a = var_b前后始终没变: 0015F8A8
  2. var_a的地址对应的值在ref_var_a = var_b之后变成了var_b的地址对应的值: 2
  3. 由于var_a的值发生了变化, 而ref_var_a指向var_a, 所以之后ref_var_a的值也变成了2