【C++ 学习笔记】 异类指针篇
Void Pointer
(void *)类型 指针是一种特殊的指针,可以用以指向任意的数据类型。但是void*类型指针当然也有它的局限,不能将这个类型的指针指向其他的既定的类型,如char*。
如果要进行转换则需要强制类型转换。如:
void* ptr = "HAHAHA"; char* str = (char*) ptr;
Volatile Pointer
volatile 和 const都是类型限定符。volatile关键字可以用来说明一个变量有可能被意想不到的改变。如果一个变量被多次应用那么编译器的优化程序就会将其拷贝到寄存器中进行程序的优化,而当这个变量一直在改变的时候这样的优化很明显是不合理的,于是你便可以使用volatile这个关键词来告诉优化器你能将这个变量拷贝到寄存器进行优化。volatile变量一般可以用于多线程的共享变量、并行设备的寄存器等。
指向volatile变量的指针说明这个指针指向的值可能被意想不到的改变,譬如在多线程中你两次读取这个指针可能得到的值是不一样的。如果你要去volatile的值最好把值一次取出来防止值在运算过程中改变。
指向volatile变量的指针定义:
int val = 0; volatile int* ptr = &val;
volatile指针说明这个指针可能被意想不到的改变。定义:
int val = 0; int* volatile ptr = &val;
Const Pointer
const 指针是指指针一旦被赋值后不能做修改,应当写成下面的形式:
int val = 0; int* const ptr = &val;
ptr = 1; //报错!!不可重置指针值
大家肯定觉得很奇怪为什么const关键字不写在指针类型int*的前面,这样写是另一种指针称为指向const对象的指针,这两种类型很容易混淆。指向const对象的指针指向的对象不可修改而指针本身是可以修改的。这种指针应当吧const写在前面,即写成下面的形式:
int val = 0; int* const ptr = &val; *ptr = 0; //报错!!不可重置指针所指对象的值
auto_ptr
auto_ptr在C++标准库中定义的一种指针,用于处理指针的内存回收问题。auto_ptr会接管赋给他们的指针的所有权(ownship),当该指针失效时(离开其作用域等)atuo_ptr会自动的释放该指针指向的内存。我们可以这样定义一个auto_ptr:
int val = 0; int* ptr = &val; auto_ptr<int> aptr(ptr);
因为需要隐式的析构,所以必须知道指针的类型,为了防止void* 指针赋值给auto_ptr,可以使用explicit关键字:
explicit auto_ptr<int> aptr(ptr);