写在前面
- 由于自身才疏学浅。不能很好领会C++指针。于是决定慢一点学习这一部分知识。
- 挑战是 通过看 英文版的 C++ Primer 学习。翻译上可能和平常的叫法不同。
定义
- 它是一个指向其他类型的 复合 (compound) 类型。它像引用的地方是它不是直接指向其它类型。不像的地方是,它是有自己的"权利"的 (in its own right)。
demo1 — 指针定义
int *p1, *p2; // int 指针 p1 p2
double *p3, p4; // double 指针 p3;对象 p4
- 注意 * 不可省略。不然就像 p4 它只是一个 double,而不是你期望的指针"佳人"~。
特性
- 它可以被赋值、拷贝;
- 一个指针在自己生命周期中可以指向不同的对象;
hold the address of another object — 指针的"至高真理"
‘we get the address of an object by using the address of the address-of operator &’
- & 运算符,被称为 address of 运算符,作用:取地址;
demo2 — 取地址
int val = 25;
int *p = &val; // p 拿着 val 的地址;p 是 指向 val 的指针
- 这里我要穿插我看《算法笔记》的一点知识:p存地址,而*p则是一把钥匙,打开地址的门,取到里面的内容。
- 注意类型对应,int 指针 指向 int 对象。上面也提到了,引用不是一个对象,我们的指针是指向对象的,所以byebye引用。这里暂时和你没什么关系。
Pointer value — 指针 到底有什么 value
共有4种状态:
- 指向对象;
- point to the location just immediately past the end of an object;(看不懂,中文书上是紧邻对象所指向的下一个位置)
- 空指针,即它没有指向任何对象;
- 可以是无效的,即上述3种之外的情况。
注意事项的翻译:"试图使用无效指针是错误的。我们都甚至没有初始化它,所以使用时候出现的问题编译器也不太好检测。试图 access 它的结果也是未定义过的。那么一定要知道一个指针是不是有效。尽管情况2、3下的指针有效,它们的使用仍然受限。因为它们不指向任何对象。那么我们就不要用他们找对象。就算找了,结果也是没有定义的。”
Using a Pointer to Access an object
- *运算符,用来访问对象。也就是上一部分提到的 access。
- 一定要用在有效的指针上,上面的话不能白看。
Demo 3 — *的作用
int val = 42;
int *p = &val;
cout << *p;
// 结果:42
*p = 0;
cout << *p;
// 结果:0
cout << p;
// 结果:一个地址值
- 对,它就是前面提到的那把钥匙。用来解开指向 p 对象的内容。