指针详解
// 指针的初值
1. 指针无须在定义时赋初值
2. 在块作用域内定义的指针未被初始化时其初值未定,与内置类型一样
// 指针的指向
1. 一般情况下,指针的类型必须与所指的数据类型一致,但以下情况除外
- 允许一个指向常量的指针指向一个非常量对象上。引用同理
- void*万能指针可指向任意数据类型
2. 指针不能指向的类型
- 不能定义一个指向引用的指针,因为引用不是对象,没有实际地址
// 指针的大小与运算
1. 两个指针相加减,结果的类型是ptrdiff_t类型,与size_t一样,都定义在cstddef
2. 指针的大小与类型无关,只与当前使用的平台架构有关
// 空指针
1. 定义:不指向任何对象的指针
2. 获取空指针:最直接的办法就是用字面值nullptr来初始化指针
- int* p = nullptr;
- int* p = 0;
- int* p = NULL;
3. NULL:是一个预处理量,可以赋值给指针,定义在cstdlib中,其值为0
4. nullptr:
常量指针与指针常量
// 常量指针,又叫常指针
1. const int* p = &a;
2. 本质是个指针,它指向的内存空间的值不能被修改,并不等同于该指针指向常量
3. 数组指针:本质是指针,它指向数组
4. 函数指针:本质是指针,指针指向一个函数
5. 底层const:指向的内容是个常量
// 指针常量
1. int* const p = &a;
2. 本质是个常量,只是这个常量的含义是一个指针,不能更改该指针的指向
3. 指针数组:本质是个数组,数组元素是指针
4. 指针函数:本质是个函数,其返回值是一个指针
5. 顶层const:指针本身是个常量