理解指针


(1)指针的类型
(2)指针指向的类型
(3)指针的值
(4)指针本身所占的内存区

指针的类型必须与其所指的对象的类型一致, 但是有两个例外:

 1. 指向常量的指针可以指向一个非常量的对象。
 2. 

指针的值


1:指向一个变量
2:指向紧临变量所占空间的下一个位置。
3:空指针,意味着指针没有指向任何对象。
4:无效指针,也是上述情况之外的其他值
空指针

空指针不指向任何对象,以下是生成空指针的方法:

int* p1 = nullptr;  //nullptr是一种特殊类型的字面值,他可以被转换成任意其他指针类型
int* p2 = 0;
int* p3 = NULL://NULL是一个预处理变量,它被存放在cstdlib头文件中,它的值就是0
void * 指针

void * 是一个特殊的指针,可用于存放任何对象的地址。它和其他指针是一样的,只是我们不知道改地址到底是一个什么类型的变量。

double obj = 3.14, *pd =& obj; 
void * pv  = &obj;             //pv可以存放任意类型的变量,
pv         = pd;               //pv可以存放任意类型的指针

指向指针的引用


我们知道引用本身不是一个对象,因此不能够定义指向引用的指针,但是指针是对象,所以可以定义指向指针的引用。

#include<iostream>
using namespace std;


int main()
{
    int i   = 42;
    int* p  = nullptr;
    int*& r = p;         //r是一个对指针p的引用
          r = &i;        //给r赋值,其实就是给p赋值
         *r = 0;         //解引用r得到i,也就是p指向的对象。
    cout << "通过r改变i的值:i=" << i << endl;
    *p = 10;
    cout << "通过p改变i的值:i=" << i << endl;
    system("pause");
    return 0;
}

注意: 面对一条复杂的指针或者引用声明语句时, 从右向左阅读。