1.指针的4种状态
- 指向一个对象
- 指向近邻对象所占空间的下一个位置
- 空指针,意味着指针没有指向任何的对象
- 无效指针(野指针),也就是上述情况之外的其他值
对于第二种情况这里加以说明:
其实就是指向一个对象的后一位置,这个位置是不存在对象的,对此指针解引用将会是未定义的结果。这种指针主要作用是用来标识有效对象的边界,一旦达到这里就表示要有效对象要结束了,当前已超界。对于顺序容器和数组这种连续存储对象的类型比较有用。有了这个指针我就可以知道有效对象在内存中占据哪一段内存单元了。
2.指针的比较运算
可以用“==”和“!=”来比较两个指针,以此来判断两个指针存放的地址是否相同。如果两个指针存放的地址相同则有三种可能:
1.它们都为空
2.它们指向了同一个对象的地址
3.或则都指向了同一个对象的下一个地址,需要注意的是当一个指针指向某对象,另外一个指针指向该对象的下一个地址,此时也可能出现这两个指针相等的情况。
3.void*指针
当输出字符型变量的地址时,编译器会显示“烫烫烫烫”等乱码的bug,此时使用void*强制转换则可以显示此地址。
1 char a = 'h'; 2 cout << &a << endl;
1 char a = 'h'; 2 void* p = &a; 3 cout << p << endl;
注意:
- void*可以接收任意类型的指针变量,一般用于只关心内存地址本身不关心内存中的内容。
- 不能用void*声明变量,它不能代表一个真实的变量。
- 不能对void*指针直接解引用(需要转换成其它类型的指针)
- 把其它类型的指针赋值给void*指针不需要转换
- 把void*指针赋值给其它类型的指针需要转换
- 一个void*对象可以直接赋给另外一个void*对象