简绍


通常机器都有一系列连续编号或编址的存储单元,这些存储单元可以以单个进行操纵,也可以以连续成组的方式操纵,通常一个字节的存储单元可以存放一个char类型数据,两个字节存储单元可以存放一个short类型数据,四个字节存储单元可以存放一个long类型数据(根据机器不同,每种类型所占字节会有所不同)
指针是用来存储一个地址的一组存储单元(通常是两个或四个字节)

zhizheng

指针

指针变量p与整型变量I没有任何不同,只是I用来存储整形变量4在存储单元中占用4个字节,而P用来存储变量I的地址在存储单元中占用4个字节(这里的4个字节用于本例,根据机器不同会有所不同)

地址

p = &I,取地址运算符&可以取出某个对象的地址编号

详述

需要注意的是:

  1. 在声明指针变量时,如 int *P=&I;应该把int *看做整体,表示声明P为整型指针。
  2. 声明时如果把*P看做整体的话,后边会产生很多疑惑:比如,在声明时*P=&I;表示*P为I的地址,而在使用时*P又表示I的值。
    • 所以,在声明时int *是用于说明声明的变量为指针变量
    • 使用时在指针变量前加*,如*P,这个*P与I是有等价意义的,都是用于操纵I=4这个存储单元的变量
    • 在这里有三个变量P,*P,I
      • P:整形指针变量,指向存储变量I地址的存储单元
      • *P:指向变量I的存储单元
      • I:指向变量I的存储单元

图解


看大图 http://7xocno.com1.z0.glb.clouddn.com/point-address-detail.png

总结


  1. 地址运算符&,只能用于内存中的对象,即变量与数组元素,不能用于表达式、常量、register类型变量
  2. 每个指针都必须指向某种特定数据类型(一个例外情况是指向void指针可以存放指向任何类型的指针,但他不能间接引用自身,后会有详述)
  3. 对于两个指针变量iq = ip;由上图可知,最终iq与ip 指向同一对象。
  4. 对于(*p)++,括号是必须得,一元运算符结合顺序为从右到左
  5. *p可以理解为指向地址为p的一个变量