计算机二级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 函数的指针和指向函数的指针变量,9.1 指针和指针变量的概念,1.内存地址内存中存储单元的编号1)计算机硬件系统的内存储器中,拥有大量的存储单元(容量为字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个惟一的地址。2)在地址所标识的
2、存储单元中存放数据。注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。,例:int a;a=12;变量 a 内的“内容”(变量值)是12;变量值可由键盘等方法录入a变量的地址&a,是3000,变量的地址&a是编译时系统统一编码赋予的。,2.变量地址系统分配给变量的内存单元的起始地址假设有这样一个程序:main()int num;scanf(%d,”时,存取变量num值的方式可以有两种:,(1)直接访问直接利用变量的地址进行存取 1)上例中scanf(“%d”,&num)的执行过程是这样的:用变量名num作为索引值,检索符号表,找到变量num的起始地址3000;然后将键盘输入的值(假设
3、为12)送到内存单元3000至3003中。此时,变量num在内存中的地址和值,如图9-1所示。2)printf(num=%dn,num)的执行过程,与scanf()很相似:首先找到变量num的起始地址3000,然后从3000至3003中取出其值,最后将它输出。(2)间接访问通过另一变量访问该变量的值 语言规定:在程序中可以定义一种特殊的变量(称为指针变量),用来存放其它变量的地址。,例如,假设定义了这样一个指针变量p,它被分配到4000至4003单元,其值可通过赋值语句“p=num;”得到。此时,指针变量p的值就是变量num在内存中的起始地址3000,如图9-2所示(见下一页)。通过指针变量p
4、存取变量num值的过程如下:首先找到指针变量p的地址(4000),取出其值3000(正好是变量num 的起始地址);然后从3000至3003中取出变量num的值(3)。(3)两种访问方式的比较 两种访问方式之间的关系,可以用某人甲(系统)要找某人乙(变量)来类比。一种情况是,甲知道乙在何处,直接去找乙就是(即直接访问)。另一种情况是,甲不知道乙在哪,但丙(指针变量)知道,此时甲可以这么做:先找丙,从丙处获得乙的地址,然后再找乙(即间接访问)。,main()int num=12;int*p;/*p是专门用于存放其他变量(num)地址的变量,(存放整型变量地址)*/p=),p=num的首地址是30
5、00,将num地址装入了指针变量 p,4000 4003,3000,12,p,num,3000 3003图9-2,p=num的首地址是3000p指向了(首地址为3000)变量num,4.指针与指针变量(1)指针即地址(指针变量的值,称为指针,这个值是其他变量的地址)一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。(2)指针变量专门用于存储其它变量地址的变量指针变量p的值就是变量num的地址。指针与指针变量的区别/关系,就是变量值与变量(名)的区别/关系。(3)为表示指针变量和它指向的变量之间的关系,用指针运算符“*”表示。例如,指针变量p与它所指向的变量num的关系,(在上例中)
6、表示为:*p,即*p等价于变量num。而p等价于变量/*将3赋给指针变量p所指向的变量*/Return,指针变量的概念 与 小 结:指针:变量a的地址,称为变量a的指针;即1.对指针变量,定义语句中各符号的说明 类型符号“*”:说明p 是指针变量 基类型符号 int:说明p 存储整型变量的地址。(基类型,用于指针运算时的步长单位,稍后可见)变量名:p(不要用“*P”作变量名,符号“*”只是类型说明)。,2.对指针变量,引用语句中各符号的说明 常用运算符号:printf(“%d”,*p)/*引用*/3.对于指针变量的符号“*”,出现在不同位置,其作用不同(1)定义中:“*”说明所定义的变量是指针
7、变量(2)引用中:“*”是指针运算符,取指针变量指向的变量的数值,9.2 指针变量的定义与应用,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*/p_int=AL9_1.C 程序演示,3000,12,p_int,*p_i
8、nt,3000 3003图9-2,num_int,4000 4003,程序运行结果:num_int=12,*p_int=12num_f=3.14,*p_f=3.14num_ch=p,*p_ch=p 程序说明:(1)头三行的变量定义语句指针变量的定义 与一般变量的定义相比,除变量名前多了一个星号“*”(指针变量的定义标识符)外,其余一样:基(数据)类型*指针变量,*指针变量2;注意:此时的指针变量p_int、p_f、p_ch,并未指向某个具体的变量(称指针是悬空的)。使用悬空指针很容易破坏系统,导致系统瘫痪。,(2)中间三行的赋值语句取地址运算()取地址运算的格式:变量例如,&num_int、&
9、num_f、&num_ch的结果,分别为变量num_int、num_f、num_ch的地址。注意:指针变量只能存放指针(地址),且只能是相同类型变量的地址。例如,指针变量p_int、p_f、p_ch,只能分别接收int型、float型、char型变量的地址,否则出错。(3)后三行的输出语句指针运算(*)使用直接访问和间接访问两种方式,分别输出变量num_int、num_f、num_ch的值。注意:这三行出现在指针变量前的星号“*”是指针运算符,访问指针变量所指向的变量的值,而非指针定义标识符。,理解:如果已定义point1是指向变量a的指针变量,(int a=12,*point1;point1
10、=3、(*point1)+:即a+*point1+:等价*(point1+),案例9.2 使用指针变量求解:输入2个整数,按升序(从小到大排序)输出。/*案例代码文件名:AL9_2.C*/main()int num1,num2;int*num1_p=AL9_2.C 程序演示,程序运行情况: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(较小
11、值),num2_p指向变量num1(较大值)。(2)printf(“min=%d,max=%dn”,*num1_p,*num2_p);语句:通过指针变量,间接访问变量的值。,9.2.2 指针变量作函数参数1.指针变量,既可以作为函数的形参,也可以作函数的实参。2.指针变量作实参时,与普通变量一样,也是“值传递”,即将指针变量的值(一个地址)传递给被调用函数的形参(必须是一个指针变量)。注意:被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。案例9.3 使用函数调用方式改写案例9.2,要求实参为指针变量。/*案例代码文件名:AL9_3.C*/*/*exchange()功
12、能:交换2个形参指针变量所指向的变量的值*/*形参:2个,均为指向整型数据的指针变量*/*返回值:无*/*/,void exchange(int*pointer1,int*pointer2)int temp;temp=*pointer1,*pointer1=*pointer2,*pointer2=temp;/*主函数main()*/main()int num1,num2;int*num1_p=AL9_3.C 程序演示,案例9.3 与案例9.2的主要区别是 通过函数exchange()的调用,交换2个形参指针变量所指向的变量的值。功能:/*在函数exchange()的调用中,实参把地址传给形参,
13、形参指针变量所指向的(变量)存储单元地址与实参指针变量所指向的(变量)存储单元地址是同一单元。其效果是:交换2个形参指针变量所指向的变量的值,实参指针变量所指向的变量的值 也随之交换。原因是:实参、形参指向的是同一地址单元,num2_p,&num 2,pointer2,&num 2,num2,6,num1_p,&num 1,pointer1,&num 1,num 1,8,函数的调用时,把实参指针变量的值(地址),传给了形参指针变量,形、实二者指向的是同一地址单元:,-图 9-5-,调用函数exchange()之前、之时、结束时和结束后的情况,如图所示(见前一页)。形参指针变量pointer1(
14、指向变量num1)和pointer2(指向变量num2),在函数调用开始时才分配存储空间,函数调用结束后立即被释放。虽然被调用函数不能改变实参指针变量的值,但可以改变它们所指向的变量的值。,9.3 数组的指针和指向数组的指针变量,9.3.1 概述1.概念数组的指针数组在内存中的起始地址,数组元素的指针数组元素在内存中的起始地址。2.指向数组的指针变量的定义指向数组的指针变量的定义,与指向普通变量的指针变量的定义方法一样。例如,int array10,*pointer=array(或注意:数组名代表数组在内存中的起始地址(与第1个元素的地址相同),所以可以用数组名给指针变量赋值。,3.数组元素的
15、引用数组元素的引用,既可用下标法,也可用指针法。使用下标法,直观;而使用指针法,能使目标程序占用内存少、运行速度快。9.3.2 通过指针引用数组元素如果有“int a 10,*p=a;”,则:(1)p+i和a+i都是数组元素a i的地址,如图9-6(见下一页)所示。实际地址为p+i*d,d为每个数组元素所占的字节数。(2)*(p+i)和*(a+i)就是数组元素a i。实际上,在编译时,对数组元素a i就是处理成*(a+i)。(3)指向数组的指针变量,也可将其看作是数组名,因而可按下标法来使用。例如,p i等价于*(p+i)。注意:p+1指向数组的下一个元素,而不是简单地使指针变量p的值+1。其
16、实际变化为p+1*size(size为一个元素占用的字节数)。例如,假设指针变量p的当前值为1000,则p+1为1000+1*4=1004,而不是1001。如图9-6(见下一页)所示,元素起始地址a0 1000a1 1004a2 1008a3 1012a i 1016 a5 1020a6 1024a7 1028a8 1032a9 1036,a 数组,如果有“int a 10,*p=a;”,则:(1)p+i和a+i都是数组元素a i的地址,如图所示。实际地址为p+i*d,d为每个数组元素所占的字节数。(2)*(p+i)和*(a+i)就是数组元素a i。实际上,在编译时,对数组元素a i就是处理成
17、*(a+i)。(3)指向数组的指针变量,也可将其看作是数组名,因而可按下标法来使用。例如,p i等价于*(p+i)。(有条件:p=a;)等价元素a i。,p 1000,p+1,a+1,图9-6,案例9.5 使用指向数组的指针变量来引用数组元素。/*案例代码文件名:AL9_5.C*/*程序功能:使用指向数组的指针变量来引用数组元素*/#include main()int array10,*p=array,i;printf(“Input 10 numbers:”);for(i=0;i10;i+)scanf(“%d”,p+i);/*使用指针变量来输入数组元素的值*/printf(“array10:”
18、);for(i=0;i10;i+)printf(“%d”,*(p+i);/*使用指向数组的指针变量输出数组元素的值*/printf(“n”);AL9_5.C 程序演示程序运行情况:Input 10 numbers:0 1 2 3 4 5 6 7 8 9array10:0 1 2 3 4 5 6 7 8 9,说明:(1)指针变量的值是可以改变的,所以必须注意其当前值,否则容易出错。(2)指向数组的指针变量,可以指向数组以后的内存单元,虽然没有实际意义。(3)对指向数组的指针变量(px和py)进行算术运算和关系运算的含义 1)可以进行的算术运算,只有以下几种:pxn,px+/+px,px-/-px
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 二级 语言程序设计
链接地址:https://www.31ppt.com/p-4995609.html