from:http://blog.csdn.net/amber2012/article/details/8950132
一个有效的指针必然是以下三种状态之一:
- 保存一个特定对象的地址;
- 指向某个对象后面的另一对象;
- 0 值。若指针保存0 值,表明它不指向任何对象。
未初始化的指针是无效的,直到给该指针赋值后,才可使用它。
关于未初始化的指针:
对大多数的编译器来说,如果使用未初始化的指针,会将指针中存放的不确定值视为地址,然后操纵该内存地址中存放的位内容。使用未初始化的指针相当于操纵这个不确定地址中存储的基础数据。
C++ 语言无法检测指针是否未被初始化,也无法区分有效地址和由指针分配到的存储空间中存放的二进制位形成的地址。建议程序员在使用之前初始化所有的变量,尤其是指针。
如果可能的话,除非所指向的对象已经存在,否则不要先定义指针,这样可避免定义一个未初始化的指针。
如果必须分开定义指针和其所指向的对象,则将指针初始化为 0。因为编译器可检测出 0 值的指针,程序可判断该指针并未指向一个对象。
判断指针没有指向任何对象:
- <span style="font-family:FangSong_GB2312;font-size:14px;"> //方式1:
- int *pval_1 = 0;
- if( pval_1 == 0 ){
- cout << " pointer pval_1 no ref an object" << endl;
- }
- // 方式2:
- int *pval_2;
- pval_2 = 0;
- if( pval_2 == 0 ){
- cout << " pointer pval_2 no ref an object" << endl;
- }</span>
把 int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0。但允许把数值 0 或在编译时可获得 0 值的 const 量赋给指针。
指针的初始化:
对指针进行初始化或赋值只能使用以下四种类型的值:
- 0 值常量表达式,例如,在编译时可获得 0 值的整型 const对象或字面值常量 0;
- 类型匹配的对象的地址;
- 另一对象末的下一地址;
- 同类型的另一个有效指针。
关于void*类型的指针:
- 可以保存任何对象类型的地址;
- void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型。
void*所支持的几种操作:
- 与另一个指针进行比较;
- 向函数传递void* 指针或从函数返回 void* 指针;
- 给另一个 void* 指针赋值;
- 不允许使用void* 指针操纵它所指向的对象。