简绍
通常机器都有一系列连续编号或编址的存储单元,这些存储单元可以以单个进行操纵,也可以以连续成组的方式操纵,通常一个字节的存储单元可以存放一个char类型数据,两个字节存储单元可以存放一个short类型数据,四个字节存储单元可以存放一个long类型数据(根据机器不同,每种类型所占字节会有所不同)
指针是用来存储一个地址的一组存储单元(通常是两个或四个字节)
指针
指针变量p与整型变量I没有任何不同,只是I用来存储整形变量4在存储单元中占用4个字节,而P用来存储变量I的地址在存储单元中占用4个字节(这里的4个字节用于本例,根据机器不同会有所不同)
地址
p = &I,取地址运算符&可以取出某个对象的地址编号
详述
需要注意的是:
- 在声明指针变量时,如 int *P=&I;应该把int *看做整体,表示声明P为整型指针。
- 声明时如果把*P看做整体的话,后边会产生很多疑惑:比如,在声明时*P=&I;表示*P为I的地址,而在使用时*P又表示I的值。
- 所以,在声明时int *是用于说明声明的变量为指针变量
- 使用时在指针变量前加*,如*P,这个*P与I是有等价意义的,都是用于操纵I=4这个存储单元的变量
- 在这里有三个变量P,*P,I
- P:整形指针变量,指向存储变量I地址的存储单元
- *P:指向变量I的存储单元
- I:指向变量I的存储单元
图解

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