您好,欢迎访问三七文档
1第十七讲指针与数组教学目的与要求:掌握一维数组、二维数组的指针表示法掌握用指针引用字符串教学内容提要:1.指针与二维数组2.指针与字符串教学重点:指针与二维数组、指针与字符串教学难点:指针与二维数组教学进度:P220~P232教学过程:2一、指针与二维数组1.二维数组的地址设有一个二维数组a,它有三行四列:inta[3][4];数组名a:代表整个二维数组的首地址,也就是第0行的首地址。a+i:代表第i行的首地址。(见下页图)3数组名a代表整个二维数组的首地址:a[0]a[1]a[2]a===19173111971523上图a数组包含三个元素:a[0],a[1],a[2].而每个元素又是一个一维数组,它包含4个元素(即4个列元素),如:a[0]又包含:a[0][0],a[0][1],a[0][2],a[0][3].4一维数组名a[i]:代表第i行的首地址,即第i行中第0列元素的地址(既&a[i][0])。a[i]+j:代表第i行中的第j个元素的地址,即为&a[i][j]。注意地址变化的单位数值在不同的场合的实际字节数是不同的:“a+1”中的“1”实际代表数组中一行元素所占的总字节数;“a[i]+1”中的“1”代表数组中一个元素所占的字节数。5a+2a数组a[0]a[1]a[2]aa+1(2000)(2008)(2016)a代表第0行的首地址,a+1代表第1行的首地址,a+2代表第2行的首地址.每行存放4个整型数据(即1个元素占2个字节),因此,这里+1的含义是:+4*2=+8个字节.62000120023200452006720089201011201213201415201617201819202021202223aa+1a+2a[0]+1a[0]+2a[0]+3行地址,元素地址的表示法7例用指针表示法输出二维数组的各元素。#includestdio.hmain(){staticinta[2][3]={{0,1,2,},{3,4,5}};intk,j,*p;for(j=0;j2;j++)/*方式1*/{for(k=0;k3;k++)printf(%5d,*(a[j]+k));/*a[j]是j行首地址,a[j]+k是j行k列元素的地址*/putchar(‘\n’);}putchar(‘\n’);8接上页:for(j=0;j2;j++)/*方式2*/{for(k=0;k3;k++)printf(%5d,*(*(a+j)+k));/**(a+j)是j行首地址,*(a+j)+k是j行k列元素的地址*/putchar(‘\n’);}p=a;/*p指向数组的第一个元素*/for(j=0;j2;j++)/*方式3*/{for(k=0;k3;k++)printf(%5d,*(p++));/*输出p所指示的元素*/putchar(‘\n’);}}9输出的结果是:012345012345012345102.指向二维数组的指针变量有两种情况:一是直接指向数组元素的指针变量;二是指向一个含有m个元素的一维数组。这两种不同形式的指针变量,其使用方法不同。(1)指向数组元素的指针变量,即简单指针变量,如:int*p,a[3][4];p=&a[1][2];(2)指向由m个元素组成的一维数组的指针变量定义形式:类型(*指针变量)[元素个数]如:int(*p)[4];11注意:(1)int(*p)[4];定义一个指针变量p,p指向包含4个元素的一维数组。(2)p+i与*(p+i)的区别:p+i是指向第i行的指针(第i行的首地址);*(p+i)是指向第i行第1个元素的地址;两者数值相等,但含义不同:p+i的增值将以行长为单位,而*(p+i)增值将以元素长度为单位。12即:p+i+1将指向第i行再下一行的首地址,而*(p+i)+1将指向第i行首元素的下一个元素地址。(见下图)设inta[3][4],(*p)[4];p=a;P,aP+1P+2a[0]a[1]a[2]如果p先指向a[0],则p+1不是指向a[0][1],而是指向a[1]13例main(){staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int(*p)[4],i,j;p=a;scanf(i=%d,j=%d,&i,&j);printf(a[%d][%d]=%d\n,i,j,*(*(p+i)+j));}14main(){inta[3][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8}};inti;int(*p)[4]=a,*q=a[0];for(i=0;i3;i++){if(i==0)(*p)[i+i/2]=*q+1;elsep++,++q;}for(i=0;i3;i++)printf(%d,,a[i][i]);printf(%d,%d\n,*((int*)p),*q);}运行结果:2,4,7,5,3123434565678pq2pqpq例二维数组与指针运算15二.指针与字符串1.字符串的表示形式用字符数组实现(已学过):main(){staticcharstring[]=ILoveChina!;printf(%s\n,string);}运行时输出:ILoveChina!跟我来!16用字符指针实现:字符指针变量的定义:char*p;赋值:指针=串中某一字符地址;!e串首址Iv...sLo\0跟我来!例如main(){char*s=“ILoveChina!”;(初始化s)17例:•用字符数组实现例main(){charstring[]=“IloveChina!”;printf(“%s\n”,string);printf(“%s\n”,string+7);}IloveChistring[0]string[1]string[2]string[3]string[4]string[5]string[6]string[7]string[8]string[9]stringstring[10]string[11]string[12]string[13]n!a\018例main(){char*string=“IloveChina!”;printf(“%s\n”,string);string+=7;while(*string){putchar(string[0]);string++;}}IloveChistringn!a\0字符指针初始化:把字符串首地址赋给stringchar*string;string=“IloveChina!”;string*string!=0用字符指针实现19char*cp;与charstr[20];•str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址•charstr[20];str=“IloveChina!”;()char*cp;cp=“IloveChina!”;()•str是地址常量;cp是地址变量•cp接受键入字符串时,必须先开辟存储空间例charstr[10];scanf(“%s”,str);()而char*cp;scanf(“%s”,cp);()改为:char*cp,str[10];cp=str;scanf(“%s”,cp);()字符指针变量与字符数组20例1:将一个已知字符串第n个字符开始的剩余字符复制到另一个字符串中.跟我来!2.应用举例main(){chara[80],b[80],*p,*q;intn,k;定义21puts(b);}gets(a);scanf(“%d”,&n);输入已知字符串和np=a;q=b;p+=n-1;指针p定位到第n个字符while(*p!=‘\0’){*q=*p;q++;p++;}拷贝实际字符*q=‘\0’;字符串加结束标记22三、指针数组指针数组:是指针变量的集合。即它的每一个元素都是指针变量,且都具有相同的存储类别和指向相同的数据类型。指针数组的定义形式为:类型标识符*数组名[数组长度说明];例如:int*p[10];p为10个元素的数组,它的各元素都是一个整型变量的指针。例一个指针数组的元素指向整型数据的简单例子。main(){staticinta[5]={1,3,5,7,9};int*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};inti;for(i=0;i<5;i++)printf(%d\t,*num[i]);}24指针数组广泛应用于对字符串的处理例如有定义:char*p[3];定义了一个具有三个元素p[0],p[1],p[2]的指针数组。每个元素都可以指向一个字符数组,或字符串。若利用数组初始化,则:char*p[3]={“Basic”,“c++”,“pascal”};P[0]指向字符串“Basic”;P[1]指向字符串“c++”;P[2]指向字符串“pascal”;25charname[5][9]={“gain”,“much”,“stronger”,“point”,“bye”};char*name[5]={“gain”,“much”,“stronger”,“point”,“bye”};gain\0stronger\0point\0much\0name[0]name[1]name[2]name[3]name[4]bye\0gain\0stronger\0point\0much\0bye\0二维数组存储空间固定字符指针数组相当于可变列长的二维数组分配内存单元=数组维数*2+各字符串长度指针数组元素的作用相当于二维数组的行名但指针数组中元素是指针变量二维数组的行名是地址常量二维数组与指针数组区别:26char*name[]={“Followme”,“BASIC”,“GreatWall”,“FORTRAN”,“ComputerDesign};name是指针数组,元素均是指针数据,可定义一指针变量,指向数组,对数组各元素操作。如:char*name[4],**p;p=name;又如:p=name+2;printf(“%d,%d,%s”,p,*p,**p);输出:2004,3016,Greatwall20003016200427小结指向二维数组的指针的引用数组指针的使用用指针引用字符串作业:
本文标题:c语言教案第17讲
链接地址:https://www.777doc.com/doc-3377426 .html