指针是什么?

 指针是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。


指针是什么?

二.指针变量的定义

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样以下是有效的指针声明:

int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

三.指针变量的引用

指针变量和普通变量一样,在使用之前不仅要说明定义说明,而且必须赋予具体的值。未进赋值的指针变量的指针变量不能使用,否则将造成系统混乱。对指针变量赋值只能赋予一个内存地址,决不能赋予其他数据,否则将引起错误。

  关于指针类型的数据,有两个相关的运算符。

(1)取地址运算符&。

         取地址运算符&是一个单目运算符,其结合性为自右向左,其功能是取得变量的地址。

         &变量名

         例如:&a表示变量a的地址,&b表示变量b的地址。变量本身必须预先说明。

         假设有如下语句 char c,*p;那么可以有 p=&c;

          或者char c,*p=&c;

  (2)指针运算符*。

        指针运算符*是一个单目运算符,通常称为间接访问运算符,其结合为自左向右用来表示该指针所在的变量。

        例如char c,*p=&c;

        x=*p;