计算机二级C语言程序设计第9讲.ppt
《计算机二级C语言程序设计第9讲.ppt》由会员分享,可在线阅读,更多相关《计算机二级C语言程序设计第9讲.ppt(58页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第第9讲讲 指指 针针指针是语言中的重要概念,也是语言的重要特色。指针是语言中的重要概念,也是语言的重要特色。使用指针,可以使程序更加简洁、紧凑、高效。使用指针,可以使程序更加简洁、紧凑、高效。9.1 指针和指针变量的概念指针和指针变量的概念9.2 指针变量的定义与应用指针变量的定义与应用9.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量 9.4 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量9.5 返回指针值的函数返回指针值的函数 9.6 指针数组与主函数指针数组与主函数main()的形参的形参 9.7 函数的指针和指向函数的指针变量函数的指针和指向函
2、数的指针变量9.1 指针和指针变量的概念指针和指针变量的概念1.内存地址内存地址内存中存储单元的编号内存中存储单元的编号1)计算机硬件系统的内存储器中,拥有大量的存储单元(容量为)计算机硬件系统的内存储器中,拥有大量的存储单元(容量为字节)。字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的的“地址地址”。每个存储单元都有一个惟一的地址。每个存储单元都有一个惟一的地址。2)在地址所标识的存储单元中存放数据。)在地址所标识的存储单元中存放数据。注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。注意:内存单元
3、的地址与内存单元中的数据是两个完全不同的概念。例:例:int a;a=12;变量变量 a 内的内的“内容内容”(变量值)是(变量值)是12;变量值可由键盘等方法录入变量值可由键盘等方法录入a变量的变量的地址地址&a,是是3000,变量的变量的地址地址&a是是编译时编译时系统统一编码赋予的。系统统一编码赋予的。123000a图9-12.变量地址变量地址系统分配给变量的内存单元的起始地址系统分配给变量的内存单元的起始地址假设有这样一个程序:假设有这样一个程序:main()int num;scanf(%d,&num);printf(num=%dn,num);C编编译译程程序序编编译译到到该该变变量量
4、定定义义语语句句时时,将将变变量量num 登登录录到到“符符号号表表”中中。符符号号表表的的关关键键属属性性有有两两个个:一一是是“标标识识符符名名(id)”,二二是是该该标标识符在内存空间中的识符在内存空间中的“地址(地址(addr)”。为为描描述述方方便便,假假设设系系统统分分配配给给变变量量num的的4字字节节存存储储单单元元为为 3000 至至3003,则,则起始地址起始地址3000就是变量就是变量num在内存中的地址。在内存中的地址。3.变量值的存取变量值的存取通过变量在内存中的地址进行通过变量在内存中的地址进行系系 统统 执执 行行“scanf(”%d“,&num);”和和“pri
5、ntf(”num=%dn“,num);”时,存取变量时,存取变量num值的方式可以有两种:值的方式可以有两种:(1)直接访问直接访问直接利用变量的地址进行存取直接利用变量的地址进行存取 1)上例中上例中scanf(“%d”,&num)的执行过程是这样的:的执行过程是这样的:用用变变量量名名num作作为为索索引引值值,检检索索符符号号表表,找找到到变变量量num的的起起始始地地址址3000;然然后后将将键键盘盘输输入入的的值值(假假设设为为12)送送到到内内存存单单元元3000至至3003中。此时,变量中。此时,变量num在内存中的地址和值,如图在内存中的地址和值,如图9-1所示。所示。2)pr
6、intf(num=%dn,num)的执行过程,与的执行过程,与scanf()很相似:很相似:首首先先找找到到变变量量num的的起起始始地地址址3000,然然后后从从3000至至3003中中取取出出其其值,最后将它输出。值,最后将它输出。(2)间接访问间接访问通过另一变量访问该变量的值通过另一变量访问该变量的值 语语言言规规定定:在在程程序序中中可可以以定定义义一一种种特特殊殊的的变变量量(称称为为指指针针变变量量),用来存放,用来存放其它变量的地址其它变量的地址。例例如如,假假设设定定义义了了这这样样一一个个指指针针变变量量p,它它被被分分配配到到4000至至4003单单元元,其其值值可可通通
7、过过赋赋值值语语句句“p=num;”得得到到。此此时时,指指针针变变量量p的的值值就就是变量是变量num在内存中的起始在内存中的起始地址地址3000,如图,如图9-2所示所示(见下一页见下一页)。通过指针变量通过指针变量p存取变量存取变量num值的过程如下:值的过程如下:首首先先找找到到指指针针变变量量p的的地地址址(4000),取取出出其其值值3000(正正好好是是变变量量num 的起始地址);的起始地址);然后从然后从3000至至3003中取出变量中取出变量num的值(的值(3)。)。(3)两种访问方式的比较)两种访问方式的比较 两两种种访访问问方方式式之之间间的的关关系系,可可以以用用某
8、某人人甲甲(系系统统)要要找找某某人人乙乙(变变量)来类比。量)来类比。一种情况是,甲知道乙在何处,直接去找乙就是(即直接访问)。一种情况是,甲知道乙在何处,直接去找乙就是(即直接访问)。另另一一种种情情况况是是,甲甲不不知知道道乙乙在在哪哪,但但丙丙(指指针针变变量量)知知道道,此此时时甲甲可以这么做:先找丙,从丙处获得乙的地址,然后再找乙(即间接访问)。可以这么做:先找丙,从丙处获得乙的地址,然后再找乙(即间接访问)。main()int num=12;int*p;/*p是专门用于存放其他变量(是专门用于存放其他变量(num)地址的变量,(存放)地址的变量,(存放整型变量整型变量地址)地址)
9、*/p=#/*p是变量,专门存放是变量,专门存放整形变量整形变量地址地址 (这里不要写成(这里不要写成“*p”)*/scanf(“%d”,p);scanf(“%d”,&num);printf(“%dn”,*p);printf(“%dn”,num);运行结果:运行结果:12(对应(对应scanf(“%d”,p);)12(scanf(“%d”,&num);)12(printf(“%dn”,num);)12(printf(“%dn”,*p);)p=#num的首地址是3000,将num地址装入了指针变量p4000 4003300012pnum3000 3003图9-2p=#nu
10、m的首地址是3000p指向了(首地址为3000)变量num4.指针与指针变量指针与指针变量(1)指针)指针即地址即地址(指针变量的值,称为指针,这个值是(指针变量的值,称为指针,这个值是其他变量其他变量的地址)的地址)一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。(2)指针变量)指针变量专门用于存储其它变量地址的变量专门用于存储其它变量地址的变量指指针针变变量量p的的值值就就是是变变量量num的的地地址址。指指针针与与指指针针变变量量的的区区别别/关关系系,就就是是变量值与变量(名)的区别变量值与变量(名)的区别/关
11、系。关系。(3)为为表表示示指指针针变变量量和和它它指指向向的的变变量量之之间间的的关关系系,用用指指针针运运算算符符“*”表表示。示。例如,指针变量例如,指针变量p与它所指向的变量与它所指向的变量num的关系,的关系,(在上例中在上例中)表示为:表示为:*p,即,即*p等价于变量等价于变量num。而。而p等价于变量等价于变量&num因此,下面两个语句因此,下面两个语句(num=3;*p=3;)的作用相同:的作用相同:int *p,num;/*定义定义p为指针变量,定义为指针变量,定义num为指普通变量为指普通变量*/*int表示表示p指向整型变量,指向整型变量,“*”表示表示 p是指针型变量
12、是指针型变量*/num=3;/*将将3直接赋给普通变量直接赋给普通变量num*/p=#/*把把num的地址装入的地址装入p,使,使p指向指向num*/*p=3;/*将将3赋给指针变量赋给指针变量p所指向的变量所指向的变量*/Return指针指针变量的变量的概念概念 与与 小小 结结 :指针指针:变量:变量a的地址,称为变量的地址,称为变量a的指针;即的指针;即&a称为变量称为变量a的指针的指针指针变量:指针变量:用用于专门存放地址的变量称为指针变量(于专门存放地址的变量称为指针变量(p)。)。指针变量指针变量定义的格式:定义的格式:基类型基类型 *指针变量指针变量;普通变量定义:普通变
13、量定义:int a;指针变量定义:指针变量定义:int *p;1.对指针变量,对指针变量,定义定义语句中各符号语句中各符号的说明的说明 类型符号类型符号“*”:说明:说明p 是指针变量是指针变量 基基类类型型符符号号 int:说说明明p 存存储储整整型型变变量量的的地地址址。(基基类类型型,用用于于指指针针运运算算时时的的步步长长单单位,稍后可见位,稍后可见)变量名:变量名:p (不要用(不要用“*P”作变量名,符号作变量名,符号“*”只是类型说明)。只是类型说明)。2.对指针变量,对指针变量,引用引用语句中各符号的说明语句中各符号的说明 常用运算符号:常用运算符号:&:取址运算,如:取址运算
14、,如:&a,取变量取变量a 地址地址 *:取值运算(指针运算),取指针变量指向的变量的数值取值运算(指针运算),取指针变量指向的变量的数值 例:例:int a=2,*p;/*定义定义*/p=&a ;scanf(“%d”,p);printf(“%d”,*p)/*引用引用*/3.对于指针变量的符号对于指针变量的符号“*”,出现在不同位置,其作用不同,出现在不同位置,其作用不同(1)定义中:)定义中:“*”说明所定义的变量是指针变量说明所定义的变量是指针变量(2)引用中:)引用中:“*”是是指针运算符指针运算符,取指针变量指向的变量的数值取指针变量指向的变量的数值 9.2 指针变量的定义与应用指针变
15、量的定义与应用 9.2.1 指针变量的定义与相关运算指针变量的定义与相关运算案例案例9.1 指针变量的定义与相关运算示例。指针变量的定义与相关运算示例。/*案例代码文件名:案例代码文件名:AL9_1.C*/#include main()int num_int=12,*p_int;/*定义一个指向定义一个指向int型数据的指针变量型数据的指针变量p_int*/float num_f=3.14,*p_f;/*定义一个指向定义一个指向float型数据的指针变量型数据的指针变量p_f*/char num_ch=p,*p_ch;/*定义一个指向定义一个指向char型数据的指针变量型数据的指针变量p_ch
16、*/p_int=&num_int;/*取变量取变量num_int的地址,赋值给的地址,赋值给p_int*/p_f=&num_f;/*取变量取变量num_f的地址,赋值给的地址,赋值给p_f*/p_ch=&num_ch;/*取变量取变量num_ch的地址,赋值给的地址,赋值给p_ch*/printf(“num_int=%d,*p_int=%dn”,num_int,*p_int);printf(“num_f=%4.2f,*p_f=%4.2fn”,num_f,*p_f);printf(“num_ch=%c,*p_ch=%cn”,num_ch,*p_ch);AL9_1.C 程序演示程序演示300012
17、p_int*p_int3000 3003图9-2num_int4000 4003程序运行结果:程序运行结果:num_int=12,*p_int=12num_f=3.14,*p_f=3.14num_ch=p,*p_ch=p 程序说明:程序说明:(1)头三行的变量定义语句)头三行的变量定义语句指针变量的定义指针变量的定义 与与一一般般变变量量的的定定义义相相比比,除除变变量量名名前前多多了了一一个个星星号号“*”(指指针针变变量的定义标识符)外,其余一样:量的定义标识符)外,其余一样:基基(数据)(数据)类型类型 *指针变量指针变量,*指针变量指针变量2;注注意意:此此时时的的指指针针变变量量p_
18、int、p_f、p_ch,并并未未指指向向某某个个具具体体的的变变量(称指针是悬空的)。使用悬空指针很容易破坏系统,导致系统瘫痪。量(称指针是悬空的)。使用悬空指针很容易破坏系统,导致系统瘫痪。(2)中间三行的赋值语句中间三行的赋值语句取地址运算取地址运算()取地址运算的格式:取地址运算的格式:变量变量例例如如,&num_int、&num_f、&num_ch的的结结果果,分分别别为为变变量量num_int、num_f、num_ch的地址。的地址。注注意意:指指针针变变量量只只能能存存放放指指针针(地地址址),且且只只能能是是相相同同类类型型变变量量的的地址。地址。例例如如,指指针针变变量量p_
19、int、p_f、p_ch,只只能能分分别别接接收收int型型、float型型、char型变量的地址,否则出错。型变量的地址,否则出错。(3)后三行的输出语句)后三行的输出语句指针运算(指针运算(*)使使用用直直接接访访问问和和间间接接访访问问两两种种方方式式,分分别别输输出出变变量量num_int、num_f、num_ch的值。的值。注注意意:这这三三行行出出现现在在指指针针变变量量前前的的星星号号“*”是是指指针针运运算算符符,访访问问指针变量所指向的变量的值,而非指针定义标识符。指针变量所指向的变量的值,而非指针定义标识符。理解:如果已定义理解:如果已定义point1是指向变量是指向变量a
20、的指针变量,的指针变量,(int a=12,*point1;point1=&a;)则则1、&*point1的含义:的含义:&a,即变量,即变量a的地址;的地址;2、*&a的含义:即变量的含义:即变量a;3、(*point1)+:即即a+*point1+:等价:等价 *(point1+)案案例例9.2 使使用用指指针针变变量量求求解解:输输入入2个个整整数数,按按升升序序(从从小小到到大大排排序序)输出。输出。/*案例代码文件名:案例代码文件名:AL9_2.C*/main()int num1,num2;int*num1_p=&num1,*num2_p=&num2,*pointer;printf(
21、“Input the first number:”);scanf(“%d”,num1_p);printf(“Input the second number:”);scanf(“%d”,num2_p);printf(“num1=%d,num2=%dn”,num1,num2);if(*num1_p *num2_p)/*如如果果num1num2,则则交交换换指指针针*/pointer=num1_p,num1_p=num2_p,num2_p=pointer;printf(“min=%d,max=%dn”,*num1_p,*num2_p);printf(“num1=%d,num2=%dn”,num1,n
22、um2);AL9_2.C 程序演示程序演示num1_p&num2num2_p&num1num19num26交换指针后:num1_p&num 1num2_p&num2num19num26交换指针前:程序运行情况:程序运行情况:Input the first number:9Input the second number:6num1=9,num2=6min=6,max=9num1=9,num2=6程序说明:程序说明:(1)第)第5行的行的if语句语句 如如果果*num1_p*num2_p(即即num1num2),则则交交换换指指针针,使使num1_p指指向向变变量量num2(较较小小值值),num
23、2_p指指向向变变量量num1(较较大大值值)。)。(2)printf(“min=%d,max=%dn”,*num1_p,*num2_p);语语句句:通过指针变量,间接访问变量的值。通过指针变量,间接访问变量的值。9.2.2 指针变量作函数参数指针变量作函数参数1.指针变量,既可以作为函数的形参,也可以作函数的实参。指针变量,既可以作为函数的形参,也可以作函数的实参。2.指针变量作实参时,与普通变量一样,也是指针变量作实参时,与普通变量一样,也是“值传递值传递”,即将指针变量的值,即将指针变量的值(一个地址)传递给被调用函数的形参(必须是一个指针变量)。(一个地址)传递给被调用函数的形参(必须
24、是一个指针变量)。注意:被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指注意:被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。向的变量的值。案例案例9.3 使用函数调用方式改写使用函数调用方式改写案例案例9.2,要求实参为指针变量。,要求实参为指针变量。/*案例代码文件名:案例代码文件名:AL9_3.C*/*/*exchange()功能:功能:交换交换2个个形参形参指针变量指针变量所指向的所指向的变量变量的的值值 */*形参:形参:2个,均为指向整型数据的指针变量个,均为指向整型数据的指针变量 */*返回值:无返回值:无 */*/void exchan
25、ge(int *pointer1,int *pointer2)int temp;temp=*pointer1,*pointer1=*pointer2,*pointer2=temp;/*主函数主函数main()*/main()int num1,num2;int*num1_p=&num1,*num2_p=&num2;printf(“Input the first number:”);scanf(“%d”,num1_p);printf(“Input the second number:”);scanf(“%d”,num2_p);printf(“num1=%d,num2=%dn”,num1,num2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 二级 语言程序设计
限制150内