文档介绍:第八章
地址和指针
指针的概念
指针类型是C语言中使用十分普遍的数据类型,它与一般的变量不同之处是它包含的不是数据的值,而是另一变量的地址。
指针是C语言中的一个重要概念,正确而熟练地掌握了指针的概念和指针的使用,就能设计出复杂的数据结构和高效的程序,没有掌握指针就没有掌握C语言的精华。
凡是程序中定义的变量,在编译时系统都给他们分配相应的存贮单元,,给整形和实型分配4个字节,每个变量所占的存贮单元都有确定的地址,具体地址在编译时分配。
指针的概念
C程序的变量所存放的数据:
数值型数据:整数、实数
通过前面的学习,我们已知道:
字符型数据:字符、字符串
占有一定长度的内存单元
如:int x; x占4字节、4个单元
每一个变量都有一个地址,为无符号整数,它不同于一般的整数。
问题:能否对地址运算?
能否用一个变量保存地址?
这些变量具有的性质:
例: short int a=3, b=4;
float c=,d=;
char e=‘x’,f=‘y’;
1010
1012
1014
a
1018
1022
1023
b
c
d
e
f
3
4
x
y
要访问内存中的变量,在程序中是通过变量名来引用变量的值。但实际上,在编译时将每个变量名对应一个地址,在内存中不再出现变量名而只有地址。
若程序中引用变量a,系统找到对应地址1010,然后从1010,1011两个字节中取出其中的值。
一、数据在内存中的存放
设:系统分配i的起始地址为2000的单元
内存:为一个连续编号(连续地址)且以一个单元为一个字节的连续存贮区。
若程序中定义了三个int变量i, j, k
short int i= – 5, j=5, k=10;
则: j的起始地址有可能为为2002的单元
k的起始地址有可能为2004的单元
2000
2001
2002
2003
2004
2005
3001
– 5
+5
10
2000
i
j
k
当程序中要用它们的值时:
y=i+j+k;
找到j的地址2002,将2002,2003中的数据5读出;
找到k的地址2004,将2004,2005中的数据10读出。
分别找到i的地址2000,将2000,2001中的数据–5读出;
则系统通过一张变量名与地址对应关系表:
上述过程称为变量的“直接访问”
然后把这些数据进行算术运算。
直接访问:直接使用存放该数据的变量名。
i
相当于使用5
使用变量
如:用pi, pj, pk来存放i, j, k的地址
2000
2002
2004
5
5
10
3001
3003
3005
3007
2000
2002
2004
pi
pj
pk
i
j
k
若要得到变量i的值,可以先访问pi,得到i的地址,再通过该地址找到它i的值。显然,pi与i是通过i的地址联系起来的。
间接访问:如果将某一变量的地址(如i的地址2000)存放到另一个变量x,则可通过x来存取i的值。
直接访问:通过变量名或地址访问一个变量的方式为“直接访问”。
间接访问:把地址存放在一个变量中,然后通过先找出地址变量中的值(一个地址),再由此地址找到最终要访问的变量的方法称为“间接访问”
注: 存放地址的变量是一种特殊的变量,它只能用来存放地址而不能用来存放其它类型的数据,需要专门加以定义。