指针是我们学习cpp的难攻克堡垒。
重要的事情说三遍
- 指针就是持有内存地址的变量
int a = 5
我们知道不同类型占据内存大小也不同,在这里先不管这个,我们知道 a 就是内存地址, a = 5,就是把 5 保存在内存地址为 a (可以理解为内存地址别名)的内存中。
| 内存地址 | 值 |
| :----------- | - :|
| 100 | |
| 101 | |
| 102 "a" | 5 |
| 103 | |
| 104 | |
| 105 | |
a = RAM[102]
这是就是 direct addrssing (直接通过地址获取变量值)
然后我们定义一个变量为 b 类型为指针,用于保存内存地址,内存地址可简单理解为门牌号。
pointer b
| 内存地址 | 值 |
| :----------- | - :|
| 100 "c" | |
| 101 | |
| 102 "a" | 5 |
| 103 | |
| 104 | |
| 105 "b" | 102 |
我们可以给 b 赋上一个内存地址的值
pointer b = 100
在 cpp 中我们可以通过 & 获取获取指针的值(也就是内存地址的实际值)。
pointer b = &a
那么就是相对于把 a 的持有的内存地址值(102)赋值给了 b 这个指针类型
b 有了 5 的内存地址,那么我们理论上是可通过 b 找到 5 的,这种方式叫做间接寻址(indirect addressing)
在定义一个变量 c ,这里又有新的符号登场了 * ,*是操作符将指针类型变量保存的内存地址所指向的内存中保存的值取出来。 b 保存 102 ,102 地址内存中保存值为 5 。我想大家应该理解了吧
int c = *b
| 内存地址 | 值 |
| :----------- | - :|
| 100 "c" | 5 |
| 101 | |
| 102 "a" | 5 |
| 103 | |
| 104 | |
| 105 "b" | 102 |
这里关键了解一下 & 和 * 这两个操作符,然后理解指针就是持有内存地址变量。
但是在 cpp 中没有指针类型变量 pointer 是我在这里为讲解虚构出来的,在 cpp 定义指针类型变量是这样做的
int* b = &a
或者
int *b = &a
这么设计有点过分,无形中给 develper 代码麻烦,这里用 * 那里也用* ,我们可以通过 = 将 * 区分为表示 pointer 类型和取值操作符。
Java-Vs-Kotlin-–-Which-Should-You-Choose-For-Android-Development.png
网友评论