1. 如果某个指针变量可以保存包含int类型值的内存位置的地址,则该变量的类型是“指向int”类型的指针。
    2. 间接成员选择操作符->专用于通过指针访问结构(或类)的成员.

    指针结构体变量用 ->, 普通结构体变量用 .

    点运算符(.)左边为结构体名称。
    箭头运算符(->)左边为结构体指针。

    顺便说一句,*运算符两边的空格是可选的。

    1. //传统上,C程序员使用这种格式
    2. int *ptr //这强调*p是一个int类型的值。
    3. //而很多C++程序员使用这种格式:
    4. int* ptr;
    5. //这强调的是:int*是一种类型——指向int的指针。在哪里添加空格对于编译器来说没有任何区别,您至可以这样做:
    6. int*ptr;
    7. int * ptr;
    8. //但要知道的是,下面的声明创建一个指针(p1)和一个int变量(p2):
    9. int* p1,p2;
    10. //对每个指针变量名,都需要使用一个*.

    注意:在C++中,int*是一种复合类型,是指向int的指针。

    可以在声明语句中初始化指针。在这种情况下,被初始化的是指针,而不是它指向的值。
    也就是说,下面的语句将pt(而不是*pt)的值设置为& higgens:

    1. int higgens =5
    2. int* pt= &higgens

    警告:一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。这是关于使用指针的金科玉律。

    为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的通用格式如下

    1. typeName * pointer_name = new typeName;

    需要在两个地方指定数据类型:用来指定需要什么样的内存和用来声明合适的指针.

    对于指针,需要指出的另一点是,new分配的内存块通常与常规变量声明分配的内存块不同。变量 nights和pd的值都存储在被称为栈( stack)的内存区域中,而new从被称为堆(heap)或自由存储区( free store)的内存区域分配内存。第9章将更详细地讨论这一点。

    不要尝试释放已经释放的内存块,C++标准指出,这样做的结果将是不确定的,这意味着什么情况都可能发生。另外,不能使用 delete来释放声明变量所获得的内存.

    1. int* ps=new int; //ok
    2. delete ps; //ok
    3. delete ps; //ok
    4. int jugs = 5; //ok
    5. int* pi=&jugs; //ok
    6. delete pi; //not allowed,memory

    通常,对于大型数据(如数组,字符串,和结构),应使用new,这正是new的用武之地.

    使用new创建动态数组

    1. int* psome=new int[10];
    2. //new 返回第一个元素的地址
    3. delete []psome;

    总之,使用new和 delete时,应遵守以下规则。

    • 不要使用 delete来释放不是new分配的内存。
    • 不要使用 delete释放同一个内存块两次
    • 如果使用new[]为数组分配内存,则应使用 delete[]来释放
    • 如果使用new[]为一个实体分配内存,则应使用 delete(没有方括号)来释放
    • 对空指针应用 delete是安全的。

    指向常量的指针:

    1. int age=89;
    2. const int* pt=&age;

    该声明指出,pt指向一个 const int(这里为39),因此不能使用pt来修改这个值。换句话来说,*pt的值为 const,不能被修改:
    将const变量的地址赋值给指向const的指针✔
    将const的地址赋值给常规指针.×

    1. const float g_erath=9.8;
    2. const float* pe=&g_earth; //valid
    3. const float g_moon=1.63;
    4. float* pm =&g_moon;

    对第一种:既不能用g_earth来修改9.8,也不能用pe来修改.
    C++进制将const的地址赋值给非const的指针.