C语言程序设计ppt课件-第9章.ppt
《C语言程序设计ppt课件-第9章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计ppt课件-第9章.ppt(105页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2022-7-26华中科技大学计算机学院1C C语言程序设计语言程序设计The C Programming Language华中科技大学计算机学院华中科技大学计算机学院曹计昌曹计昌2022-7-26华中科技大学计算机学院29.1 9.1 指针的概念与指针的使用指针的概念与指针的使用 9.1.1 9.1.1 指针的概念指针的概念 数据(变量、常量)(根据类型)占有一定数数据(变量、常量)(根据类型)占有一定数目的连续存储单元;目的连续存储单元;数据的连续存储单元首地址称为数据的地址。数据的连续存储单元首地址称为数据的地址。变量的地址称为指针,存放地址数据的变量称变量的地址称为指针,存放地址数据的
2、变量称为指针变量。为指针变量。指针也是一种变量,也要占用一定的内存单元。指针也是一种变量,也要占用一定的内存单元。指针的特殊之处在于它存放的是另一个变量所指针的特殊之处在于它存放的是另一个变量所占存储单元的起始地址。占存储单元的起始地址。 2022-7-26华中科技大学计算机学院3指针变量的类型由其基类型决定指针变量的类型由其基类型决定. .基类型是指针变量所指基类型是指针变量所指( (即所指向即所指向) )变量的数据变量的数据类型。类型。因此,称指向某种类型变量的指针为该类型的因此,称指向某种类型变量的指针为该类型的指针。指针。 如:指向整型变量的指针称为整型指针,指向如:指向整型变量的指针
3、称为整型指针,指向字符型变量的指针称为字符指针等。字符型变量的指针称为字符指针等。不管是何种类型的指针不管是何种类型的指针, ,所占的存储与机器字所占的存储与机器字长相当长相当. .如如:16:16位机位机, ,指针占指针占2 2字节字节,思考思考: : 为什么指针指针有类型为什么指针指针有类型? ?指针变量的类型指针变量的类型2022-7-26华中科技大学计算机学院4ptrptr指向指向x x 如果整型变量如果整型变量x x的地址是的地址是0 xFEC00 xFEC0,x x的值是的值是0 xABCD0 xABCD,整型指针整型指针ptrptr的地址是的地址是0 xFEBC0 xFEBC,整
4、型指针,整型指针ptrptr指向整型指向整型变量变量x x的内存存储和指向情况可以由下图描述:的内存存储和指向情况可以由下图描述:0 xFEBC0 xFEBC,ptrptr之址之址C0C00 xFEBD0 xFEBDFEFE0 xFEC00 xFEC0,x x的低字节的低字节CDCD0 xFEC10 xFEC1ABAB0 xFEC20 xFEC20 xFEC30 xFEC30 xFEC40 xFEC42022-7-26华中科技大学计算机学院59.1.2 9.1.2 指针的声明指针的声明声明指针的一般形式:声明指针的一般形式: T T * *标识符标识符1 1,* *标识符标识符2 2,, ,
5、* *标识符标识符n n; 其中,其中,T T是数据类型。是数据类型。* *是指针说明符,用于将是指针说明符,用于将其说明的标识符说明为指针类型。标识符其说明的标识符说明为指针类型。标识符1 1,标,标识符识符2 2,标识符,标识符n n是是T T类型的指针的名字类型的指针的名字. .例例9.19.1:char char * *pc1,pc1,* *pc2;pc2; intint * *pi;pi; float float * *pf; pf; 2022-7-26华中科技大学计算机学院6 指针变量也可以在声明的时候对其进行初指针变量也可以在声明的时候对其进行初始化,但必须用所指变量的地址进行初
6、始化。始化,但必须用所指变量的地址进行初始化。初始化后的指针将指向以初值为地址的变量。初始化后的指针将指向以初值为地址的变量。 例例9.2 9.2 声明指针并初始化。声明指针并初始化。 intint x=10, x=10,* *p=&x; p=&x; 错误的声明错误的声明: : int int * *p=&x,xp=&x,x=10;=10;2022-7-26华中科技大学计算机学院7例例9.3 9.3 给出以下一些复杂声明,给出以下一些复杂声明,解释其含义。解释其含义。1.int (*p1)3;2.double *p25;3.char (*fp)(int,int);4.int *pf(float
7、 a);5.int (*fp_ary2)(char *,int *);2022-7-26华中科技大学计算机学院89.1.3 9.1.3 指针的使用指针的使用 在声明指针变量的前提下,指针的使用首在声明指针变量的前提下,指针的使用首先要获取变量的地址作为指针值,然后要将该先要获取变量的地址作为指针值,然后要将该指针值赋给指针变量,建立指针变量与被指变指针值赋给指针变量,建立指针变量与被指变量间的指向关系。接下来就是如何通过指针变量间的指向关系。接下来就是如何通过指针变量来间接访问和操作指针所指的变量。量来间接访问和操作指针所指的变量。2022-7-26华中科技大学计算机学院9 1. 1. 取地址
8、运算符取地址运算符- -单目单目& & 单目单目& &在在C C中表示取地址运算。该表达式的一般使中表示取地址运算。该表达式的一般使用形式是:用形式是: & &右操作数右操作数 根据表达式的操作语义可知,右操作数必须是根据表达式的操作语义可知,右操作数必须是一个左值表达式。如果右操作数的类型是一个左值表达式。如果右操作数的类型是T T,则表,则表达式达式& &右操作数的类型是右操作数的类型是T T * *。 2022-7-26华中科技大学计算机学院10 2. 2. 指针的赋值指针的赋值 指针的声明只是创建了指针变量,获得了指指针的声明只是创建了指针变量,获得了指针变量的存储,但并没有给出指针变
9、量指向那个针变量的存储,但并没有给出指针变量指向那个具体的变量,此时指针的值是不确定的随机值,具体的变量,此时指针的值是不确定的随机值,指针处于指针处于“无所指无所指”的状态。例如:用的状态。例如:用 intint * *p;p;语句来说明语句来说明p p是一个整型指针变量时,是一个整型指针变量时,p p的值是不的值是不确定的随机值。此时称确定的随机值。此时称p p为悬挂指针。为悬挂指针。 2022-7-26华中科技大学计算机学院11例例9.5 9.5 设有下面说明:设有下面说明: intint i, i,* *pi;pi; char c, char c,* *pc;pc; float x5,
10、 float x5,* *pf;pf;则:则:npi=&i; pi=&i; 取整型变量取整型变量i i的地址赋给整型指针变量的地址赋给整型指针变量pi.pi.npc=&c; pc=&c; 取出字符变量取出字符变量c c的地址赋给字符指针变量的地址赋给字符指针变量pc.pc.npf=&x0;pf=&x0;和和pf=x;pf=x;的作用相同,均表示将的作用相同,均表示将x x数组的起数组的起始地址赋给指针变量始地址赋给指针变量pf, pf, 使使pfpf指向指向x x数组的第一个元数组的第一个元素素x0 x0。n数组名数组名x x的数据类型是的数据类型是float float * *,并且标识,并
11、且标识x x数组的起数组的起始地址始地址, ,因此语句因此语句pf=x;pf=x;合法有效。合法有效。2022-7-26华中科技大学计算机学院12 3. 3. 间访运算符单目间访运算符单目* *n声明指针的目的是希望通过指针实现对内存中变量声明指针的目的是希望通过指针实现对内存中变量的快速访问,必须使用单目的快速访问,必须使用单目* *这个间访运算符才能这个间访运算符才能实现利用指针对内存变量的访问。间访的含义是间实现利用指针对内存变量的访问。间访的含义是间接访问。单目接访问。单目* *运算实际上是单目运算实际上是单目& &运算的逆运算运算的逆运算. .n使用单目使用单目* *间访变量的一般形
12、式是:间访变量的一般形式是: * *操作数操作数n“* *操作数操作数”称为称为间访表达式间访表达式,它的操作语义是引,它的操作语义是引用以操作数之值为地址的变量。操作数也可以是表用以操作数之值为地址的变量。操作数也可以是表达式,但其值必须是地址值。达式,但其值必须是地址值。n间访表达式的值是一个左值,代表指针所指的变量。间访表达式的值是一个左值,代表指针所指的变量。而指针所指的变量的类型就是间访表达式运算结果而指针所指的变量的类型就是间访表达式运算结果的类型。的类型。 2022-7-26华中科技大学计算机学院13例例9.6 9.6 间访运算符的基本操作举例。间访运算符的基本操作举例。设有声明
13、和赋值:设有声明和赋值:char ch=a,char ch=a,* *pc=&chpc=&ch; * *pc=bpc=b; 并且假设字符变量并且假设字符变量chch的地址是的地址是0 x1b2a0 x1b2a,试问,试问chch,pcpc,以及,以及* *pcpc的值是什么?的值是什么?2022-7-26华中科技大学计算机学院144. 4. 无值型指针无值型指针 类型为类型为void void * *的指针称为无值型指针或的指针称为无值型指针或voidvoid指针。指针。C C语言规定,任何类型的指针都可语言规定,任何类型的指针都可以将其值赋给以将其值赋给voidvoid指针,但是不能对指针,
14、但是不能对voidvoid指针指针执行间访操作,即对执行间访操作,即对voidvoid指针施行指针施行“* *”操作操作属于非法操作。属于非法操作。int x=1,int x=1,* *pxpx=&x;=&x;char ch=char ch=a a, ,* *pc=&chpc=&ch, ,* *pc1;pc1;void void * *vpvp; ;则:则:vp=pxvp=px; ; vp vp=pc;=pc; pc1=(char pc1=(char * *)vp)vp; ; * *vpvp= =b b; /; /* * 非法非法 * */ /2022-7-26华中科技大学计算机学院159.2
15、 9.2 指针运算指针运算 指针允许进行算术运算、赋值运算和关系运算。指针允许进行算术运算、赋值运算和关系运算。通过指针运算可以快速定位到指定的内存单元,提通过指针运算可以快速定位到指定的内存单元,提高程序的执行效率。高程序的执行效率。9.2.1 9.2.1 指针的算术运算指针的算术运算1. 1. 指针的移动指针的移动指针的移动指指针在原有位置的基础上,通过加一个指针的移动指指针在原有位置的基础上,通过加一个整数实现指针的前移(地址增大的方向)或者通过整数实现指针的前移(地址增大的方向)或者通过减一个整数实现指针的后移。当然,如果加减的是减一个整数实现指针的后移。当然,如果加减的是一个负数,则
16、移动的方向刚好和前面相反。一个负数,则移动的方向刚好和前面相反。 2022-7-26华中科技大学计算机学院16例例9.9 9.9 指针的算术运算应用举例指针的算术运算应用举例( (演示演示EX9_9)EX9_9)。#include stdio.h#include stdio.h void main(voidvoid main(void) ) int int iary5=0,1,2,3,4; iary5=0,1,2,3,4; int int * *pxpx=&iary0;=&iary0; printf(display printf(display the address and the addr
17、ess and the value of the elements:n); the value of the elements:n); for(; for(;pxpx &iary0+5 &iary0+5;px+);px+) printf(px=%p printf(px=%p * *px=%dn,px,px=%dn,px,* *pxpx);); px px=&iary0;=&iary0; printf(after executing px printf(after executing px=&iary0:n);=&iary0:n); printf(px=%p printf(px=%p * *px
18、=%dn,px,px=%dn,px,* *px);px);2022-7-26华中科技大学计算机学院17 pxpx+=3;+=3; printf(after px printf(after px plus 3:n); plus 3:n); printf(px=%p printf(px=%p * *px=%dn,px,px=%dn,px,* *px);px); px-=2;px-=2; printf(after px minus 2:n); printf(after px minus 2:n); printf(px=%p printf(px=%p * *px=%dn,px,px=%dn,px,*
19、*px);px); printf( printf(* *(+px)=%dn,(+px)=%dn,* *(+px);(+px); printf(px=%p printf(px=%p * *px=%dn,px,px=%dn,px,* *px);px); printf( printf(* *(px+)=%dn,(px+)=%dn,* *(px+);(px+); printf(px=%p printf(px=%p * *px=%dn,px,px=%dn,px,* *px);px); printf( printf(* *(-px)=%dn,(-px)=%dn,* *(-px);(-px); printf
20、(px=%p printf(px=%p * *px=%dn,px,px=%dn,px,* *px);px); printf( printf(* *(px-)=%dn,(px-)=%dn,* *(px-);(px-); printf(px=%p printf(px=%p * *px=%dn,px,px=%dn,px,* *px);px); 2022-7-26华中科技大学计算机学院18 9.2.2 9.2.2 指针的赋值运算和关系运算指针的赋值运算和关系运算1. 1. 指针的赋值运算指针的赋值运算 指针的初始化和基本赋值操作前面指针的初始化和基本赋值操作前面已有叙述。下面主要进行一些归纳并给已有叙
21、述。下面主要进行一些归纳并给出应用的例子,其中利用指针的赋值运出应用的例子,其中利用指针的赋值运算以及类型强制来突破语言的一些制约算以及类型强制来突破语言的一些制约因素的编程算法和思想可以在底层软件因素的编程算法和思想可以在底层软件开发时借鉴,达到汇编级别开发的自由开发时借鉴,达到汇编级别开发的自由度。度。2022-7-26华中科技大学计算机学院19指针的赋值运算规则:指针的赋值运算规则:(1) (1) 同类型的指针才可以直接使用赋值操作符进行同类型的指针才可以直接使用赋值操作符进行赋值操作赋值操作。如:。如: intint a3=1,2,3, a3=1,2,3,* *p=a,p=a,* *q
22、=p;q=p;(2) (2) 如果要实现如果要实现不同基本类型指针之间的赋值运算,不同基本类型指针之间的赋值运算,必须使用类型强制必须使用类型强制。利用指针的赋值运算以及类。利用指针的赋值运算以及类型强制可以实现一些型强制可以实现一些特殊操作特殊操作。 2022-7-26华中科技大学计算机学院20n例例9.11 一个长整型数占一个长整型数占4个字节,其个字节,其中每个字节又分成高中每个字节又分成高4位和低位和低4位。试位。试从长整型数的低字节开始,依次取出每从长整型数的低字节开始,依次取出每个字节的高个字节的高4位和低位和低4位并以位并以ASCII码码的形式进行显示。的形式进行显示。2022-
23、7-26华中科技大学计算机学院21例例9.119.11( (演示演示EX9_11)EX9_11)#include stdio.h“ void main(void) long x=0 x1234ABCD,k; char *p=(char *)&x; /* 类型强制,类型强制,x被视为被视为4字节字符数组被字节字符数组被p所指所指 */ char up_half,low_half; /* up_half存高存高4位,位,low_half存低存低4位位 */ for(k=0;k4;k+) low_half=(*p)&0 x0f; /* 取低取低4位位 */if(low_half4)&0 x0f; /
24、* 取高取高4位位 */if(up_half10) up_half|=0; /* 高高4位二进制转换成位二进制转换成ASCII码码0-9 */else up_half=(up_half-10)+A; /* 高高4位二进制转换成位二进制转换成ASCII码码A-F */p+; /* 指向整型数指向整型数x下一个字节下一个字节*/printf(%c %cn,up_half,low_half); 2022-7-26华中科技大学计算机学院222 2 指针的关系运算指针的关系运算n指针的关系运算指对指针施行诸如:指针的关系运算指对指针施行诸如: , ,=,以及,以及!=!=这样一些比较操作。这样一些比较操
25、作。n指针属于一种派生类型,它属于何种类型的指针要指针属于一种派生类型,它属于何种类型的指针要受所指变量的类型,即指针的基类型的限制。受所指变量的类型,即指针的基类型的限制。n不同类型的变量在内存中分配的存储不同;对于不不同类型的变量在内存中分配的存储不同;对于不同的数据类型,定义于其上的操作和运算也不尽相同的数据类型,定义于其上的操作和运算也不尽相同。因此,尽管所有指针的值都是二进制正整数,同。因此,尽管所有指针的值都是二进制正整数,从关系运算的操作语义上看,允许不同类型的指针从关系运算的操作语义上看,允许不同类型的指针进行比较没有实际意义,并且只会给语言和程序带进行比较没有实际意义,并且只
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 ppt 课件
限制150内