欢迎来到天天文库
浏览记录
ID:50083502
大小:1.05 MB
页数:176页
时间:2020-03-08
《C语言程序设计 教学课件 作者 崔永君 彭静 全书第8章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第8章 指针8.1指针变量的定义与引用8.2指针运算符8.3指针变量与数组8.4字符指针8.5函数与指针8.6指针数组和指向指针的指针变量8.1指针变量的定义与引用8.1.1指针与指针变量一般把存储器中的一个字节称为一个内存单元,由于变量的数据类型不同,它所占的内存单元数也不相同,如整型量占2个单元,字符量占1个单元等。 例如,在程序中作如下定义:inta=1,b=2;floatx=3.14,y=5.3;doublem=3.124;charch1='a',ch2='b';先看一下编译系统是怎样为变量分配内存的。变量a、b是整型变量
2、,在内存中各占2个字节;x、y是实型,各占4个字节;m是双精度实型,占8个字节;ch1、ch2是字符型,各占1个字节。由于计算机内存是按字节编址的,假设变量的存放从内存2000单元开始,则编译系统对变量在内存中的放置情况如图8-1所示。图8-1不同数据类型的变量在内存中占用的空间由图8-1可以看出,变量在内存中按照数据类型的不同所占内存的大小也不同,每个变量都有具体的内存单元地址。为了正确访问这些内存单元,必须为每个内存单元编号。根据某个内存单元的编号即可准确地找到该内存单元,内存单元的编号也叫做地址。例如,变量a在内存的地址是200
3、0,占2个字节,变量b的内存地址就为2002,变量m的内存地址为2012等。内存单元的指针和内存单元的内容是两个不同的概念。可以用一个通俗的例子来说明它们之间的关系。我们到银行存/取款时,银行工作人员将根据我们的账号寻找我们的存款单,找到之后在存款单上写入存/取款的金额。这里,账号就是存款单的指针,存/取款数是存款单的内容。对于一个内存单元来说,单元的地址即指针,其中存放的数据才是该单元的内容。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。通过指针对所指
4、向变量的访问,也就是一种对变量的“间接访问”。 例如:设一组指针变量pa、pb、px、py、pm、pch1、pch2分别指向上例的变量a、b、x、y、m、ch1、ch2,指针变量也同样被存放在内存中,二者的关系如图8-2所示。图8-2指针变量与变量在内存中的关系图8-2中,左部所示的内存中存放了指针变量的值,该值给出的是所指变量的地址,通过该地址可以对右部描述的变量进行访问。如指针变量pa的值为2000,是变量a在内存的地址。我们称指针变量pa指向变量a,或者说pa是指向变量a的指针。变量的地址就是指针,存放指针的变量就是指针变量
5、。8.1.2指针变量的定义在C程序中,存放地址的指针变量需专门定义,指针变量的一般定义形式如下: 类型说明符*变量名;其中,* 表示这是一个指针变量,“变量名”即定义的指针变量名,“类型说明符”表示本指针变量所指向的变量的数据类型。例如:“int*p1;”表示p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。再如:staticint*p2;/*p2是指向静态整型变量的指针变量*/float*p3;/*p3是指向浮点变量的指针变量*/char
6、*p4;/*p4是指向字符变量的指针变量*/应该注意的是,一个指针变量只能指向同类型的变量,如p3只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。8.1.3指针变量的赋值未经赋值的指针变量不能使用,否则将造成系统混乱,甚至导致死机。指针变量的赋值只能赋予地址,而不能赋予任何其他数据,否则将引起错误。在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址,因此,C语言中提供了地址运算符&来表示变量的地址。 其一般形式如下:&变量名;例如&a表示变量a的地址,&b表示变量b的地址。变量本身
7、必须预先说明。设有指向整型变量的指针变量p,如要把整型变量a的地址赋予p可以有以下两种方式。(1)指针变量初始化的方法:inta;int*p=&a;(2)赋值语句的方法:inta;int*p;p=&a;8.1.4指针变量的引用【例8.1】用指针变量进行输入、输出。 源程序如下:main(){int*p,m;printf("Pleaseinputainteger:");scanf("%d",&m);p=&m;/*指针p指向变量m*/printf("%d",*p}上述程序可修改为main(){int*p,m;p=&m;printf
8、("Pleaseinputainteger:");scanf("%d",p);/* p是变量m的地址,可以替换&m*/printf("%d",m);}请读者思考一下,若将程序修改为如下形式:main(){int*p,
此文档下载收益归作者所有