《(中职)计算机程序设计(C语言)第九章第2节教学课件工信版.ppt》由会员分享,可在线阅读,更多相关《(中职)计算机程序设计(C语言)第九章第2节教学课件工信版.ppt(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、YCF(中职)计算机程序设计(C语言)第九章第2节教学课件工信版第九章第九章 指针与结构体指针与结构体9.2指针变量的应用指针变量的应用9.2指针变量的应用指针变量的应用9.2.1指针与数组指针与数组9.2.2指针与字符串指针与字符串9.2.3指针与函数指针与函数9.2.1指针与数组指针与数组1、一维数组元素及数组元素的地址假设有一5个元素的a数组,则元素和地址分别可以表示如图9-2-12、用指针变量引用数组元素如:int*p,x10=0,1,2,3,4,5,6,7,8,9;p=a;这里的指针变量p的值是x数组的首地址,即为&x0,p的值每增加1则自动跳转到下一个数组元素的地址。因此,x数组的
2、第i个元素可表示为:ai、*(a+i)、*(p+i),其中*(p+i)为指针表示法;x数组的第i个元素的地址可表示为:&ai、a+i、p+i,其中p+i为指针表示法。3、指针变量在数组中的应用【例9.9】将数组x中全部元素变成原来的2倍,再输出x数组。(1)#include(2)voidmain()(3)(4)intx=1,2,3,4,5;(5)int*p,i;(6)for(p=x;px+5;p+)(7)printf(%5d,*p);(8)printf(“n”);(9)for(i=0;i5;i+)(10)xi=xi*2;(11)p=x;(12)for(i=0;i5;i+)(13)printf(
3、%5d,*(p+i);(14)printf(n);(15)程序运行结果:12345246810注意:(1)程序第6行中的p+不能用x+替换,因为数组名x代表数组的起始地址,它是对于一个已经定义的数组是不能改变的,即为一个地址常量,而指针变量p是一个指针变量;(2)程序第11行,不能省略,必须要把指针变量p的值重新拉回到数组x的首地址;(3)程序第13行,在使用指针变量时要注意地址的值不能超出数组元素的界限。9.2.2指针与字符串指针与字符串1、指向字符串的指针变量的定义如:char*p=student;这里的赋值只是把字符串的首地址赋给p,而不是把字符串赋给p,p是一个指针变量,它不能存放一个
4、字符串,只能存放一个地址。2、利用指针变量输出字符串如:char*p=student;printf(%sn,p);输出字符串时,从指针变量p所记录的首地址开始依次向后输出直到碰到字符口串结束符0为止。因此,也可以用循环来实现字符串中字符的逐个输出如:char*p=student;for(;*p!=0;p+)printf(%c,*p);3、字符数组与字符指针变量的区别如:chars=Iamastudent.;char*p=Iamastudent.;(1)系统分配空间不同:定义数组s时,系统会给s分配一片连续的存储单元,而定义指针变量p时,系统只给p分配一个存储单元。(2)存储方式不同:数组s中存
5、放的是字符串中的字符和0,而指针变量p中存放的是字符串的首地址。(3)赋值方式不同:数组可以进行初始化,但不能使用赋值语句;如:charstr110,str2=great“;4、字符串指针的应用【例9.10】利用字符串指针实现两个字符串的复制。#includevoidmain()char*a=tiger,*b=dog;char*x=a,*y=b;puts(a);puts(b);while(*y!=0)*x=*y;x+;y+;*x=0;puts(a);puts(b);分析如图9-2-2xx+x+x+yy+y+y+0godtiger0ab图9-2-29.2.3指针与函数指针与函数1、指针变量作函数
6、的参数【例9.11】编程实现两个整型变量值的交换(要求用函数swap()实现两数值的交换)。#includevoidswap(int*a,int*b)intt;t=*a;*a=*b;*b=t;voidmain()intx,y;int*p1,*p2;p1=&x;p2=&y;x=5;y=10;swap(p1,p2);printf(x=%dty=%dn,x,y);程序中在调用swap()函数时将变量x和y的地址分别传递给了指针变量a和b,形参和实参之间的传递关系为“地址传递”,即实参随着形参的改变而改变。程序运行结果:x=10y=5实现了x和y值的交换功能。2、指针变量作函数的返回量我们在前面用到的
7、函数中的返回值的数据类型主要有int,float,char,double等,还可以无返回值即返回值类型为void,函数的返回值其实也可以是一个指针类型的数据(即地址)。若函数的返回值是一个指针类型的数据,则函数的定义格式如下:数据类型*函数名(形参表列)函数体;如:int*fun(intx,inty)【例9.12】在一个字符型数组中存放两个字符串,分别用两个指针变量记录它们的首地址(每个字符串的首地址的值由一个指针函数返回),分别输出字符型数组和两个字符串的首地址的值及两个字符串和字符型数组中已被赋好的字符。#include#include#defineSIZE100charbufSIZE;c
8、har*p=buf;char*alloc(intn)char*begin;if(p+n=buf+SIZE)begin=p;p=p+n;return(begin);elsereturn(NULL);voidmain()p2=buf+10pp1=bufbuf1buf0buf99buf15buf14buf13buf10buf9buf8210da09 图9-2-3char*p1,*p2;inti;p1=alloc(10);strcpy(p1,123456789);p2=alloc(5);strcpy(p2,abcd);printf(buf=%pn,buf);printf(p1=%pn,p1);prin
9、tf(p2=%pn,p2);puts(p1);puts(p2);for(i=0;i15;i+)printf(%c,bufi);分析如图9-2-3所示说明:(1)格式字符串%p输出变量的内存地址。(2)buf数组的输出在这里不能用%s,若用%s只能输出p1所指的字符串。用for(i=0;i15;i+)printf(%c,bufi);可将两个字符串都输出。程序运行结果:buf=00427E64p1=00427E64p2=00427E6E123456789abcd123456789abcdp2=buf+10pp1=bufbuf1buf0buf99buf15buf14buf13buf10buf9buf8210da09图9-2-3