指针是c语言中一个,而且重要概念。利用指针可以有效地表示各种复杂的数据结构,不仅能够方便、灵活地使用数组和字符串而且能像汇编语言一样处理内存地址,还能为实现函数间各类数据的传导提供简洁便利的方法。
一.变量与指针
当定义一个变量时,系统会为变量分配存储单元,不同类型的数据在存储器中所占用的内存单元数不等。例如字符型数据占用1字节的内存单元,单精度类型数据占4个字节内存单元等。系统分配给变量的内存单元的起始地址就是变量地址,也就是变量的指针。例如定义一个浮点数据变量:
float a=100;
由于变量a的数据类型为float,因此系统会为变量a分配4个字节的存储单元,并将存储单元的内容修改为100,即进行变量的初始化。如图所示:
要访问变量,可以直接使用变量名。这种方式称为直接访问方式。例如以下变量定义:
int i,j;
可直接访问变量i和j,比如:
i=5;
j=i+3;
间接访问方式是将变量的地址存放在另一个变量中。这类变量的专门存放地址的,称为指针变量。通过指针变量中保存的内存地址,可以对应的内存单元进行数据存取。假设有一个字符类型变量c,其内容为‘a’(ASCII码为十进制数97),变量c的内存地址为20c7(地址用十六进制表示表示)。若有一指针变量p,内容为变量c的内存地址,即20c7,则称指针变量p指向变量c,或者说p是指向变量c的指针,如图。此时可用变量p间接访问变量c。
二.指针变量的定义
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样以下是有效的指针声明:
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
三.指针变量的引用
指针变量和普通变量一样,在使用之前不仅要说明定义说明,而且必须赋予具体的值。未进赋值的指针变量的指针变量不能使用,否则将造成系统混乱。对指针变量赋值只能赋予一个内存地址,决不能赋予其他数据,否则将引起错误。
关于指针类型的数据,有两个相关的运算符。
(1)取地址运算符&。
取地址运算符&是一个单目运算符,其结合性为自右向左,其功能是取得变量的地址。
&变量名
例如:&a表示变量a的地址,&b表示变量b的地址。变量本身必须预先说明。
假设有如下语句 char c,*p;那么可以有 p=&c;
或者char c,*p=&c;
(2)指针运算符*。
指针运算符*是一个单目运算符,通常称为间接访问运算符,其结合为自左向右用来表示该指针所在的变量。
例如char c,*p=&c;
x=*p;