指针

最后更新于: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. 索引只有用于数组时才有意义并可定义,但是编译器不会阻止它用于非数组指针中其结果是未定义的。
';