《(中职)C语言程序设计案例教程 7.4指向二维数组的指针ppt课件.pptx》由会员分享,可在线阅读,更多相关《(中职)C语言程序设计案例教程 7.4指向二维数组的指针ppt课件.pptx(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、YCF正版可修改PPT(中职)C语言程序设计案例教程 7.4指向二维数组的指针ppt课件CONTENTS 目 录提出问题 引入新课自主学习 明确考点案例分析 交流提升仿真演练 体验探索提出问题 引入新课PART 011、一维、二维数组的组成各包括几个层次;2、一维数组元素的地址与值的表示方法提出问题 引入新课自主学习 明确考点PART 021、二维数组把数据的组织分成三个层次:一是整个由行和列组成的二维数组,二是二维数组中的行,三是二维数组每行中的单个元素。三个层次之间具有由上至下包含或由下至上形成的关系:二维数组包含若干行,一行包含若干个元素;若干元素形成一行,若干行形成一个二维数组。考点一
2、:二维数组的结构层次与二维数组元素的地址2、二维数组元素的地址设有整型二维数组int a34=0,1,2,3,4,5,6,7,8,9,11,12;设数组a的首地址为1000,各下标变量的首地址及其值如图所示。考点一:二维数组的结构层次与二维数组元素的地址1000a0001002a0111004a0221006a0331008a1041010a1151012a1261014a1371016a2081018a2191020a22111022a2312语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a0,a1,a2。每一个一维数组又含有四个元素。例如a0数组,含有a
3、00,a01,a02,a03四个元素。数组及数组元素的地址表示如下:考点一:二维数组的结构层次与二维数组元素的地址1000a0001002a0111004a0221006a0331008a1041010a1151012a1261014a1371016a2081018a2191020a22111022a2312a0a1a2100010081016考点一:二维数组的结构层次与二维数组元素的地址从二维数组的角度来看,a是二维数组名,a代表整个二维数组的首地址,也是二维数组0行的首地址,等于1000。a+1代表第一行的首地址,等于1008。如图:a0是第一个一维数组的数组名和首地址,因此也为1000。
4、它表示一维数组a00 号元素的首地址,也为1000。&a00是二维数组a的0行0列元素首地址,同样是1000。因此,a,a0,&a00,*(a+0)是等同的。a1000a+11008a+21016同理,a+1是二维数组1行的首地址,等于1008。a1是第二个一维数组的数组名和首地址,因此也为1008。&a10是二维数组a的1行0列元素地址,也是1008。因此a+1,a1,&a10,*(a+1)是等同的。由此可得出:a+i,ai,&ai0,*(a+i)是等同的。考点一:二维数组的结构层次与二维数组元素的地址另外,a0也可以看成是a0+0,是一维数组a0的0号元素的首地址,而a0+1则是a0的1号
5、元素首地址,由此可得出ai+j则是一维数组ai的j号元素首地址,它等于&aij。10000100211004210063100841010510126101471016810189102011102212aa+1a+2a0a0+1a0+2a0+33、二维数组的元素由ai元素可以用*(a+i)表示,则ai+j可表示为*(a+i)+j。由于*(a+i)+j是二维数组a的i行j列元素的首地址,所以,该元素的值就用*(*(a+i)+j)表示。考点一:二维数组的结构层次与二维数组元素的地址二维数组多种地址的表示形式:例如:有定义 int a34,*p=a;表示形式含义ai+j,*(a+i)+j,&aij
6、,pi+j第i行第j列元素的地址*(ai+j),*(*(a+i)+j),*(&aij),*(pi+j)第i行第j列元素的值考点一:二维数组的结构层次与二维数组元素的地址【例1】用指针输出二维数组#includemain()int a34=1,2,3,4,5,6,7,8,9,10,11,12;int i,j;for(i=0;i3;i+)for(j=0;j4;j+)printf(“%5d”,*(*(a+i)+j);printf(“n”);运行结果为:1 2 3 45 6 7 89 10 11 121、指向二维数组元素的指针变量定义指向二维数组元素的指针变量,定义格式*例如:int*p;考点二:指向
7、二维数组的指针变量赋值格式:;p=a0;&;p=&a00;2、计算aij在数组中的相对位置的计算公式是:i*m+j 其中m表示二维数组的列数。相对位置是指相对于数组起始位置的相对位移量(距离)。如int a34,*p;p=a;则第2行第3列的元素a23相对于a00的相对位置是2*4+311。如果开始时指针p指向a(即a00),为了得到a23的值,就可以用*(p+2*4+3)表示。(p+11)或p11表示a23的地址。所以某元素aij与*(a+i*m+j)等价。考点二:指向二维数组的指针变量考点二:指向二维数组的指针变量【例2】用指针输出二维数组的各行各列元素的值说明:利用指针的移动是以单个元素
8、为基本单位,按照元素从上到下,行内由左到右的顺序进行移动特点。#include main()static int b45=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20;int *p,i,j;p=b0;for(p=b0;pb0+20;p+)/挨个移到每个数组元素 if(p-b0)%5=0)printf(n);printf(%4d,*p);考点二:指向二维数组的指针变量【例2】用指针输出二维数组的各行各列元素的值方法2:根据数组元素在数组的相对位置的特点采用指针运算和下标运算与元素的相对位置(距离或偏移量)进行。#include main()
9、static int b45=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20;int *p,i,j;p=b;for(i=0;i4;i+)for(j=0;j 5;j+)printf(%4d,*(p+i*5+j);/采用数组元素数组中的相对位置 printf(n);定义指向二维数组中某行的指针变量,需要先定义指针变量为指向一维数组(行)的指针变量,这类指针被称为“数组指针”。一般形式为:类型说明符 (*指针变量名)长度;考点三:指向二维数组中某行的指针变量其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。”长度”表示二维数
10、组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。应注意”(*指针变量名)”两边的括号不可少,如缺少括号则表示是指针数组。说明:该指针变量的特点主要表现在以下两个方面:(1)指针的移动是以行为基本单位,对指针变量进行自增或自减算术运算进行移动时,将以行为单位进行跨越式移动。(2)通过指针变量对二维数组的元素进行引用发生变化,由于行指针以行作为指向对象,结合指针运算符,有多种表现形式,如以aij为例:ai=*(a+i)得ai+j=*(a+i)+j。p指针指向a,则pi+j可表示为*(p+i)+j,其中*(a+i)+j是二维数组a的第i行第j列元素的地址,所以,该元素的值可用*(*(a
11、+i)+j)或*(*(p+i)+j)。考点三:指向二维数组中某行的指针变量考点三:指向二维数组中某行的指针变量【例1】输出二维数组任一行任一列元素的值。#include main()static int b45=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20;int (*p)5,i,j;/定义一个数组指针 p=b;/数组指针指向二维数组名 scanf(i=%d,j=%d,&i,&j);printf(a%d%d=%dn,i,j,*(*(p+i)+j);/采用数组指针引用元素 运行情况如下:i=2,j=2(键盘输入后回车)a22=13考点三:指
12、向二维数组中某行的指针变量【例2】输出二维数组中的全部元素。main()int a34=0,1,2,3,4,5,6,7,8,9,10,11;int(*p)4;int i,j;p=a;/数组指针指向二维数组名 for(i=0;i3;i+)for(j=0;j4;j+)printf(%5d ,*(*(p+i)+j);printf(n);运行结果为:0 1 2 34 5 6 78 9 10 11考点三:指向二维数组中某行的指针变量【例3】有以下程序,分析程序运行的输出结果main()int a32=0,(*ptr)2,i,j;for(i=0;i=2;i+)ptr=a+i;scanf(%d,ptr);p
13、tr+;for(i=0;i3;i+)for(j=0;j2;j+)printf(-,aij);printf(n);若运行时输入:1 2 3,则输出结果是()。A)产生错误信息 B)1 0 C)1 2 D)1 0 2 0 3 0 2 0 0 0 0 0 3 0考点四:指向字符串的指针1、指针变量直接指向常量字符串例如:char*p;p=apple;或char*p=apple;定义指向字符串的指针变量也有两种方式:2、指针变量指向已定义的字符数组例如:char s=apple,*p;p=s;或char s10=apple,*p=s;【例4】、输出字符串中n个字符后的所有字符。main()char*p
14、s=this is a book;int n=10;ps=ps+n;printf(%sn,ps);考点四:指向字符串的指针1、对字符串中的字符进行操作2、对字符串整串进行操作 运行结果如下:input a string:ok ok ok ok num=4通过指针变量对字符串的操作方式:【例1】统计字符(如“k”)在某一字符串中出现的次数。#include main()int i,num=0;char st20,*ps;printf(input a string:n);ps=st;gets(ps);for(i=0;psi!=0;i+)if(psi=k)num+;else continue;pri
15、ntf(num=%dn,num);思考:如果要求用while语句实现,则程序如何编辑?#include stdio.hmain()char str81,substr3,*ch;int n=0;printf(输入主字符串);gets(str);printf(输入子字符串);gets(substr);ch=str;while(*ch)if(*ch=substr0&*(ch+1)=substr1)n+;ch+;printf(串%s在串%s中出现%d次!n,substr,str,n);考点三:指向二维数组中某行的指针变量【例2】、编程统计一个长度为2的字符串在另一个字符串中出现的次数,例如,假定输入字
16、符串为:string student stdiostop,子字符串为st,则应输出出现次数为4次的信息。案例分析 交流提升PART 03【例1】、以下程序运行后的输出结果是()。main()char a=Language,b=Programe;char*p1,*p2;int k;p1=a;p2=b;for(k=0;k=7;k+)if(*(p1+k)=*(p2+k)printf(%c,*(p1+k);【例2】、有以下程序运行后的输出结果是()main()char a=123456789,*p;int i=0;p=a;while(*p)if(i%2=0)*p=*;p+;i+;puts(a);【例3
17、】将字符串str1复制到字符串str2。#include void main()char str1=Whats your name?,str220;int i;for(i=0;*(str1+i)!=0;i+)*(str2+i)=*(str1+i);*(str2+i)=0;/*设置字符串str2的结束标志*/printf(String str1:t%sn,str1);/*指针法*/printf(String str2:t);for(i=0;str2i!=0;i+)/*按数组元素输出*/printf(%c,str2i);/*数组下标法*/printf(n);仿真演练,体验探索PART 041、写出
18、以下程序运行后的输出结果是()main()char *s=“one”,”two”,”three”,*p;p=s1;printf(“%c,%sn”,*(p+1),s0);A)n,two B)t,one C)w,one D)o,two2、写出以下程序运行后的输出结果是()main()char str=”xyz”,*p=str;while(*p)p+;for(p-;p-str=0;p-)puts(p);A)z B)z C)z D)x xyz yz yz xy xyz xyz3、有如下程序运行后的结果是()#include main()char st20=“Hello”,”Beijing”,*p=st
19、;printf(“%dn”,strlen(p+20);A)0 B)5 C)7 D)204、用指向字符串的指针变量合并两个字符串。要求:阅读以下程序,理解其编程思路#includevoid main()char str150,str220,*pstr1=str1,*pstr2=str2;gets(str1);gets(str2);printf(String 1 and String 2:n);printf(%sn%sn,pstr1,pstr2);while(*pstr1)pstr1+;/*移动指针到串尾*/while(*pstr2)*pstr1+=*pstr2+;/*串连接*/*pstr1=0;/*写入串的结束标志*/pstr1=str1;pstr2=str2;printf(String 1 and string 2:n);printf(%sn%sn,pstr1,pstr2);