指针
指针存储的是变量的地址。*是dereferencing,根据地址去读取值;&是取地址符,ampersand.
定义指针的格式一般为:
datatype *var_name;
int a = 10; int *p = &a;
直接打印p,打印的是地址;打印*p,根据地址取值;变量a就是10;&a表示a的引用。
指针的加减
在连续地址上移动
引用
引用和原变量一起变。
#include<iostream> using namespace std; int main() { int x = 10; // ref is a reference to x. int& ref = x; // Value of x is now changed to 20 ref = 20; cout << "x = " << x << endl ; // Value of x is now changed to 30 x = 30; cout << "ref = " << ref << endl ; return 0; }
引用的应用场景
第一个应用场景是函数参数的引用传递,这样可以避免复制很大的数据结构。
#include<iostream> using namespace std; void swap (int& first, int& second) { int temp = first; first = second; second = temp; } int main() { int a = 2, b = 3; swap(a, b); cout << a << " " << b; return 0; }
第二个应用场景是在循环中修改数据。一般在遍历的时候无法修改值。
int main() { vector<int> vect{1, 2, 3, 4, 5}; for(int& a: vect){ a += 1; } //... }
这样vec的每个值都增加了1.
指针和引用的对比
- 指针可以为空,但是引用不行;
- 指针有一级指针、二级指针甚至多级指针,但是引用只能有一级(只能有一个&);
- 指针比引用更加强大:
- 引用一旦创建就固定了,但是指针可以更换;
- 引用在声明的时候就必须初始化,但是指针不必;
- 引用比指针更加简单,更加安全。