前言
在计算机中,所有的数据和程序必须加载到内存以后程序才得以运行。那么计算机内存如何来存放这些数据或程序呢?为了方便管理和存放数据,内存通常被划分为一个一个 的单元,这些单元就称为存储单元。内存中每个内存单元也有其大小,一个内存单元如果能存放一个字节的数据,则称为字节存储单元,如果能存放一个字的数据,则称为字存储单元。每个存储单元都有一个编号,这个编号就是存储单元的“地址”,简称存储地址。每个存储单元都有一个唯一的地址。
已经知道,内存每个存储单元都有其存储地址,根据存储地址即可准确地找到该内存单元。所以通常也把这个地址称为指针。指针的实际就是内存地址。允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址。一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同值,是变量。但是常把指针变量简称为指针。定义指针的目的是为了通过指针去访问内存。既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以数据结构的地址。
通过计算机组成原理我们知道,我们所有的程序都存储在磁盘中,当我们要运行程序时才会加载进内存。指针代表的是地址,而指针变量相当于在内存中开辟了一个空间用来存储所指向变量所在空间的地址。因此,通过指针可以间接的访问变量。
一,指针变量的定义和引用
指针变量的定义:
数据类型符 *变量名;
例如:
int *p1; //单个指针变量定义
float *p2;
char *p3,*p4; //同时定义多个指针变量
float *p5,a; //普通变量和指针变量同时定义
指针变量的赋值:
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,绝不能赋予任何其他数据,否则将引起错误。在C语言中,变量的地址是由编译系统分配的,但用户并不知道变量的具体地址。其一般形式为:&变量名,如&a表示变量a的地址,&b表示变量b的地址。
1,指针变量初始化方法
int a;
int *p=&a;
2,指针变量赋值方法
int a=20;
int *p,*q;
p=&a;
q=p;
零指针:
指针变量的值为0的指针称为零指针(空指针)。其表示形式为:int *p=0;表示p向地址为0的单元,系统保证该单元不作他用,表示指针变量值没有意义。
也可以写成:int *p=NULL; //NULL在C语言中被定义为值为0的符号常量
注意:p=NULL与未对p赋值不同。
定义零指针的用途主要表现在两个方面:一是避免指针变量的非法引用,二是在程中常作为状态比较。例如:
int *p;
while (p !=NULL)
{
....
}
指针变量的引用:
当一个指针指向一个变量时,程序就可以利用这个指针间接引用这个变量。间接引用的格式是:* 指针变量。在指针变量说明中, “ * ”是类型说明符表示其后的变量是指针类型,而表这式中出现的“ * ”则是一个运算符将用以表示指针变量所指的变量。
例子一:
int *a; //此处的*用于说明a是指针变量
例子二:
int a;
int *p=&a;
*p=10; //用以表示指针变量所指的变量,相当于a=10
二,指针和地址运算
指针变量的加,减运算
指针是地址,地址是一种无符号的整数。但指针却不能像整数那样参与乘达和路理。因为对指针乘以或除以一个数没有任何意义。
指针里面存的就是变量的地址,在计算机中,地址都是从0开始编辑的,所以指针中的内容是无符号整数。
指针可以参与加法和减法运算但其加、减的含义绝对不同于一般数值的加减运算。如果指针p是这样定义的:ptype *p,并且p当前的值是ADDR,那么:
p 士 n 的值 = ADDR ±n *sizeof (ptype)
也就是说,p将以sizeof(ptype)为单位进行相加、减,而不是简单地将p的值加、减n。
int *pi;
pi++;//pi的值将是1002(假设int 型占2byte)
pi -=2; // pi的值将是998
char *pc;
pc++; // pc的值将是1001
pc -=2; //pc的值将是999
long *pl;
pl++; //pc的值将是1004
pl -=2; //pl的值将是996
2.指针变量的关系运算
两个指针变量进行关系运算可表示它们所指向的内存单元之间的关系。例如:假设p1和p2是两个指针变量:
1, pl==p2 表示pl和p2指向同一内存单元
2, pl>p2 表示p1处于高地址位置
3, pl<p2 表示pl处于低地址位置
正是因为指针变量中存放的是变量的地址,所以指针变量之间的比较并不是所指向变量内容的比较,而是地址的比较。因此会出现上面三种情况。注意,不是变量内容的比较,而是而是所指向变量的地址的比较
点关注,防走丢,如有纰漏之处,请留言指教,非常感谢
以上就是本期全部内容。有问题大家随时留言讨论 ,我们下期见。