指针
最后更新于:2022-04-02 02:06:52
[TOC]
## 概述
- 编译器无法检测到对同一个对象的多次删除操作,尤其是当内存块(或其一部分)被重新分配时。
- 为了避免这种重复删除所带来的不良后果,一种好的做法是在删除指针后立即对它赋值0或者NULL。
- 对空指针执行删除操作,不会有任何动作,也不会有错误发生。
## 有效指针
### 创建
1. 由所声明的指针变量或者 const指针(例如,数组名称)获得的栈地址。
2. 由取址运算符获得的地址。
3. 由动态内存分配运算符(如new)获得的堆地址。
### 赋值
1. 指针能够被赋予同一种类型或者派生类型的指针所保存的地址。
2. 可以将void*类型的变量赋予任何类型的指针,不需要显式的转型。
3. 将另一种(或者非派生)类型的指针所保存的地址赋予非void*类型的指针时,只能使用显式的转型。
4. 数组名称就是一个 const指针,不能被赋值。
5. 可以将NULL指针(值为0)赋予任何指针( Stroustrup 推荐使用0而不是NULL)。
### 算术运算
1. 可以对指针进行增1操作或者减1操作,即p++或者p--。
2. 可以将指针与整数相加或者相减,即p+k或者p-k
3. 只有当得到的指针值位于同一个数组的范围之内时,这种加减操作才是被定义的。唯的例外情况是:只要指针不试图解引用位于数组末尾后一个位置处的内存单元地
址,这个指针就被允许指向这个位置。
4. 两个指针可以进行减法操作。指向同一数组两个成员的两个指针相减后,其结果是表示两个元素之间的数组元素数量的一个int值。
###比较
1. 指向同一个数组中不同元素的两个指针,可以用==,!=,<,>等运算符进行比较。
2. 任何指针都能够与0进行比较。
### 间接值
1. 如果p为r*类型的指针,则*p为T类型的变量,且可以将其用于赋值运算的左边。
### 索引
1. **指针p可以用于数组索引运算符p[i],其中主为int类型。编译器会将这样的表达式解释为*(p+i)**。
2. 索引只有用于数组时才有意义并可定义,但是编译器不会阻止它用于非数组指针中其结果是未定义的。
';