欢迎来到天天文库
浏览记录
ID:40238526
大小:973.00 KB
页数:41页
时间:2019-07-28
《C语言程序设计 曹玲焕 孙萍主编 第八章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第八章指针1一、指针及其定义二、指针的运算三、指针和变量四、指针和数组五、指针和字符串六、指针和函数主要内容:end2一、指针及其定义指针指针:指针是一种数据类型,它是一个变量在内存中所对应单元的地址。指针变量是存储另一个变量的地址的变量,也就是存放地址的变量。指针变量:保存其他变量地址的变量就称为指针变量。因此,我们可以认为:指针是用于指向其他变量的变量。31.数据在内存中的存储、读取过程例如:整型变量i,j,k;在编译时为变量分配内存,内存示意图如图1所示.(2)给变量赋值为i=3;j=6;k=9;(1)假设变量
2、i,j,k被分配的内存地址分别为2000,2002,2004(3)通常,在程序中通过变量名对变量进行存取。200020022004变量i变量j变量k内存中用户数据区。。。。。。36920003010内存地址编号变量p其实程序经过编译后已将变量名转换为变量的地址,对变量值的存取都是通过变量的地址进行的。图14(1)直接访问方式按变量地址存取变量值的方式。如果读取变量i的值,直接到为变量i分配的存储单元(2000、2001字节)中取出i的值(3)即可。(2)间接访问方式先将变量i的地址存放在另一个变量p中,如果读取变量i
3、的值,先找到变量p,从p中取出内容(2000,即变量i的起始地址),然后到2000、2001字节中取出i的值(3)。即通过变量p访问为变量i分配的内存单元。访问变量的两种方式:5直接访问示意图间接访问示意图表示将数值3送到变量i中,可有两种表达方法:(1)将3送到变量i所标志的单元中。即直接访问方式(2)将3送到变量p所指向的单元(变量i)中。即间接访问方式i32000i320002000p注意:我们并不关心变量p的存储地址,对变量p的访问属于直接访问。62指针的定义指针变量与一般变量一样,必须先定义后使用。指针变量
4、定义的一般形式为:数据类型*指针变量名[,*指针变量名,…];例如:float*p;/*说明p为指向实型变量的指针变量*/intx,*px;/*说明了整型变量x和指向整型变量的指针变量px*/73指针的初始化在定义指针变量的同时赋给其初始值,让指针变量指向一个具体的变量,称为指针初始化。指针初始化的一般形式如下:数据类型*指针变量名=初始地址值;例如:inta,*pa=&a;8(1)把一个变量的地址作为初始值赋给指针变量时,该变量在指针初始化前必须定义过。因为变量在定义后系统才为其分配内存空间,地址才能确定下来。没定
5、义的变量,其地址无法确定。(2)指针指向变量的数据类型必须和指针的基类型一致。如:doubley;double*p=&y;上面的例子是用变量y的地址初始化指针p,两者的数据类型都是double型的,是正确的。若变成如下的初始化形式:doubley;float*p=&y;则是错误的。原因是y是double类型的变量,而p的基类型是floatt型的指针变量,类型不一致。(3)可以把一个初始化的指针赋给另一个指针。例如:charc;char*pc=&c;/*把字符型变量c的地址赋给指针变量pc*/char*qc=pc;/*
6、把指针变量pc中的地址值赋给指针变量qc*/这样,使得指针变量pc和qc都指向了变量c。(4)可以给指针变量初始化为空指针。例如:int*p=0;或int*p=NULL;这里NULL是在stdio.h中定义的符号常量,其代码值为0,这时,p并不是指向地址为0的存储单元,而是说p不指向任何存储单元。说明:back9二、指针的运算(一)引用运算(二)指针的算术运算(三)指针的赋值运算(四)指针的关系运算10(一)引用运算当指针变量定义并指向确定的内存单元之后,引用变量的方式可以用变量名直接引用,也可以通过指向变量的指针间
7、接引用。间接访问运算符“*”又称取内容运算符。用于获取地址对应的存储单元的内容。*和&的优先级相同,结合性为右结合。对指针变量进行取内容运算,可以得到指针变量所指向对象中的数据。例如;inti=100,j,*pi=&i;则赋值语句:j=*pi;表示把pi所指向变量(即变量i)的内容整数100赋予变量j,*pi与i等价。这句中的*既不是乘号,也不是定义指针变量时的说明符。在C语言中,如果pi指向i,则变量i与指向变量i的指针pi之间有以下等价关系:j=i;等价于j=*pi;/*j=指针变量pi的内容*/j=i;等价于j
8、=*(&i);/*j=变量i地址的内容*/取内容运算与取地址运算实质上是一对互逆运算。i++;等价于(*pi)++;/*这里的括号是不能省略的*/++i;等价于++(*pi);/*这里的括号可以省略*/++与*运算优先级相同,结合性自右至左。11(二)指针的算术运算在第六章中我们已经知道数组在内存中占据一片连续的存储单元,并且数组名代表这片存储
此文档下载收益归作者所有