收藏 分享(赏)

第四章 数组与指针.ppt

上传人:myw993772 文档编号:8842798 上传时间:2019-07-14 格式:PPT 页数:62 大小:1.10MB
下载 相关 举报
第四章 数组与指针.ppt_第1页
第1页 / 共62页
第四章 数组与指针.ppt_第2页
第2页 / 共62页
第四章 数组与指针.ppt_第3页
第3页 / 共62页
第四章 数组与指针.ppt_第4页
第4页 / 共62页
第四章 数组与指针.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

1、第4章 数组与指针,本章讲解,1.数组(一维、二维、字符数组) 2.指针的概念 3.指针与数组 4.动态内存分配 5.数组和指针的综合应用,构造数据类型之一 数组:有序数据的集合,用数组名标识 元素:属同一数据类型,用数组名和下标确定 4.1.1 一维数组 一维数组的定义 定义方式: 数据类型 数组名常量表达式;,合法标识符,表示元素个数 下标从0开始, :数组运算符 单目运算符 优先级(1) 左结合 不能用( ),例 int a6;,编译时分配连续内存 内存字节数=数组维数*sizeof(元素数据类型),数组名表示内存首地址, 是地址常量,4.1数组,一维数组的引用 数组必须先定义,后使用

2、只能逐个引用数组元素,不能一次引用整个数组 数组元素表示形式: 数组名下标 其中:下标可以是常量或整型表达式,例 int i=15;int datai; (不能用变量定义数组维数),例输出: int a10;printf(“%d”,a); ()必须 for(j=0;j10;j+)printf(“%dt”,aj); (),例 int data5; data5=10; /C语言对数组不作越界检查,使用时要 注意,输入语句:for (j=0;j10;j+)scanf(“%d”,一维数组的初始化 初始化方式,在定义数组时,为数组元素赋初值 (在编译阶段使之得到初值),int a5=1,2,3,4,5;

3、 等价于:a0=1; a1=2; a2=3; a3=4; a4=5;,说明: 数组不初始化,其元素值为随机数 对static数组元素不赋初值,系统会自动赋以0值,当全部数组元素赋初值时,可不指定数组长度,如 int a5=6,2,3;等价于: a0=6; a1=2;a2=3; a3=0; a4=0; 如 int a3=6,2,3,5,1; (),static int a5; 等价于:a0=0; a1=0; a2=0; a3=0; a4=0;,只给部分数组元素赋初值,int a=1,2,3,4,5,6; 编译系统根据初值个数确定数组维数,程序举例,例1、书P66 例4.2 :演讲比赛计算选手的最

4、后得分,规则:去掉 最高分和最低分,求剩余得分的平均分。 【任务要求】掌握求最值、平均分的算法,#include #define N 12 void main() float scoreN,min,max,sum,avg;int i;printf(“请输入12位评委给出的分数n”);for(i=0;iscorei) min=scorei; sum=sum+scorei; avg=(sum-max-min)/(N-2);printf(“最高分:%-6.2f,最低分:%-6.2fn”,max,min);printf(“选手的最后得分是:%-6.2fn”,avg); ,例2、 用数组求Fibonac

5、ci数列前20个数,#include main() int i;int f20=1,1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+) if(i%5=0) printf(“n“);printf(“%12d“,fi); ,例3:书P89页 任意输入n个整数,对其按升序对其进行排序, 并输出结果。 方法一:选择排序法,排序过程: (1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换第一趟选择排序,结果最小的数被安置在第一个元素位置上 (2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换第二趟选择排序 (3)

6、重复上述过程,共经过n-1趟排序后,排序结束,例,初始: 49 38 65 97 76 13 27 ,i=0,13,49,一趟: 13 38 65 97 76 49 27 ,i=1,27,38,完成: 13 27 38 49 65 76 97 ,#include void main() int a10,i,j,k,x;printf(“Input 10 numbers:n“);for(i=0;i10;i+)scanf(“%d“, ,方法二:冒泡法(书P91),冒泡法的思路是:将相邻两个数比较,将小的调到前头。,如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较

7、中要进行n-j次两两比较。,#include main() int a10,i,j,t;printf(“Input 10 numbers:n“);for(i=0;iai+1)t=ai; ai=ai+1; ai+1=t;printf(“The sorted numbers:n“);for(i=0;i10;i+)printf(“%d “,ai); ,4.1.2二维数组,程序设计中处理的数据是二维表格、矩阵等具有二维特征的数据,一维数组可以存储其中的数值,但并不能体现出其元素的相对位置,二维数组可以解决这个问题。,1、二维数组的定义 定义方式: 数据类型 数组名常量表达式常量表达式;例:int a3

8、4;,数组元素的存放顺序 原因:内存是一维的 二维数组:按行序优先,例 int a34; float b25;int c234;int a3,4; (),例 int a34;,每个元素ai由包含4个元素 的一维数组组成,二维数组a是由3个元素组成,a0,a1,a2,2、二维数组元素的引用和理解(理解是可见书P71) 形式: 数组名下标下标,3、 二维数组初始化赋值方法1)分行给二维数组赋初值如: int a23= 80,75,92,61,65,71;2)按数组排列的顺序给各元素赋初值如: int a23= 80,75,92,61,65,71;两种初始化方法结果均为:a00=80 a01=75

9、a02=92 a10=61 a11=65 a12=71 说明: 1)可以只对部分元素赋初值,未赋初值的元素自动取0值。例如: int a33=1,2,3; 2)如对全部元素赋初值,则第一维的长度可以不给出。例如: int a33=1,2,3,4,5,6,7,8,9;可以写为: int a3=1,2,3,4,5,6,7,8,9;,4、补充例题(书P69例4.3学生自学),例1 将二维数组行列元素互换,存到另一个数组中 【任务要求】掌握求二维数组的转置的算法,例2 求二维数组中最大元素值及其行列号 【任务要求】掌握求二维数组的最值的算法,#include main() int a34=1,2,3,

10、4,9,8,7,6,-10,10,-5,2;int i,j,row=0,colum=0,max;max=a00;for(i=0;imax) max=aij;row=i;colum=j;printf(“max=%d,row=%d, colum=%dn“,max,row,colum); ,【归纳总结】,图4-6 一维数组与二维数组的关系,1、字符数组的定义 定义,2、字符数组的初始化 逐个字符赋值 用字符串常量,例 char ch10, s 510;,4.1.3字符数组,例如:char s=C, ,p,r,o,g,r,a,m, 0;char s=“C program“; char s=“C pro

11、gram“;上面的附初值完全相等数组s在内存中的实际存放情况为:,3、字符串 字符串及其结束标志 无字符串变量,用字符数组处理字符串 字符串结束标志:0,内存存放字符ASCII码,例4.4将给定的字符串“”C program”逆序存储并输出。 【任务要求】掌握字符串的处理方法,/*Example44.c 字符串的逆序存储*/ #include void main() char str=“C program”;char ch; int i, n;n=sizeof(str)-1;for(i=0;in/2;i+)ch=stri;stri=strn-i-1;strn-i-1=ch;printf(“%s

12、n”,str); ,应用举例书P88,例4.13 输入一行字符,统计其中有多少个单词,程序如下: #include main() char str 81;int i, n=0,word=0;char c;gets(str);for(i=0;(stri)!=0;i+)if(stri= ) word=0;else if(word=0) word=1; n+; printf(“There are %d words in the linen”,n); ,常用的字符串处理函数 包含在头文件 string.h,字符串输出函数puts 格式:puts(字符数组) 功能:向显示器输出字符串(输出完,换行) 说

13、明:字符数组必须以0结束,字符串输入函数gets 格式:gets(字符数组) 功能:从键盘输入一以回车结束的字符串放入字符数组中, 并自动加0 说明:输入串长度应小于字符数组维数,例 #include main( ) char string80;printf(“Input a string:”);gets(string);puts(string); 输入: How are you? 输出: How are you ?,例 #include main( ) char string80;printf(“Input a string:”);scanf(“%s”,string);printf(“n%s

14、”,string); 输入: How are you? 输出: How,scanf中%s输入时,遇空格或回车结束,字符串连接函数strcat 格式:strcat(字符数组1,字符数组2) 功能:把字符数组2连到字符数组1后面 返值:返回字符数组1的首地址 说明:字符数组1必须足够大连接前,两串均以0结束;连接后,串1的0取消,新串最后加0,字符串拷贝函数strcpy 格式:strcpy(字符数组1,字符串2) 功能:将字符串2,拷贝到字符数组1中去 返值:返回字符数组1的首地址 说明:字符数组1必须足够大拷贝时0一同拷贝不能使用赋值语句为一个字符数组赋值,例 char str120,str22

15、0;str1=“Hello!”; ()str2=str1; (),改正:strcpy(str1,”Hello!”);strcpy(str2,str1);,以下字符串的处理函数可参看教材P134,例 strcpy与strcat举例,#include #include void main() char destination25;char blank = “ ”, c= “C+”,turbo = “Turbo”;strcpy(destination, turbo);strcat(destination, blank);strcat(destination, c);printf(“%sn“, des

16、tination); ,结果输出:Turbo C+,字符串比较函数strcmp 格式:strcmp(字符串1,字符串2) 功能:比较两个字符串 比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或0为止 返值:返回int型整数,a. 若字符串1 字符串2, 返回正整数c. 若字符串1= 字符串2, 返回零 说明:字符串比较不能用“=”,必须用strcmp,字符串长度函数strlen 格式:strlen(字符数组) 功能:计算字符串长度 返值:返回字符串实际长度,不包括0在内,例 对于以下字符串,strlen(s)的值为: (1)char s10=A,0,B,C,0,D; (

17、2)char s =“tv0willn”; (3)char s =“x69082n”;,答案:1 3 1,strcmp与strlen举例,例 有三个字符串,找出其中最大者,#include #include main() char string20,str320;int i;for(i=0;i0)strcpy(string,str0);elsestrcpy(string,str1);if(strcmp(str2,string)0)strcpy(string,str2);printf(“n最大字符串:%s,长度:%d”,string,strlen(string); ,4.2指针,指针是语言中广泛

18、使用的一种数据类型,运用指针编程是语言最主要的风格之一。利用指针变量可以表示各种数据结构,能很方便地使用数组和字符串,可编出精练而高效的程序。,内存单元模拟,4.2.1 地址和指针的概念,1. 地址和指针的概念内存地址内存中存储单元的编号,以字节为单位;变量的地址系统分配给变量内存单元的起始地址;指针即地址,一个变量的存储地址的编号;指针变量专门用于存储其它变量地址的变量。,这样,a和地址变量p就建立了联系。对于a变量,就可以通过指针p去间接的访问。有如下关系:,2、指针变量的定义一般形式: 数据类型 *指针名;,基类型,表示定义指针变量不是*运算符,例 int *p1,*p2;float *

19、q ;static char *name;,合法标识符,注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值,两者关系:互为逆运算 理解,3、指针变量的使用 &与*运算符含义,含义: 取变量的地址 单目运算符 优先级: 2 结合性:自右向左,含义: 取指针所指向变量的内容 单目运算符 优先级: 2 结合性:自右向左,p-指针变量,它的内容是地址量 *p-指针的目标变量,它的内容是数据 &p-指针变量占用内存的地址,p = &i = &

20、(*p) i = *p = *(&i),p &i &(*p) i *p *(&i),4. 空类型指针和零指针空类型: char *p1; /p1为字符型指针 void *p2; /p2为空指针,不指向任何一种数据类型 p1= (char *)p2; /强制类型转换,将p2由空型指针转换成字符型指针零指针: #define NULL 0 char *q1=0; char *q2=NULL; 用途:避免指针变量的非法引用,p指向地址为0的单元, 系统保证该单元不作它用 表示指针变量值没有意义,5. 指针运算指针可以参与运算,如关系、算术、自增自减等运算,但通常情况下,指针指向同一数组时,运算才具有

21、意义。(和一位数组的关系再详讲),例补充 输入两个数,并使其从大到小输出,不改变a,b的值。,main() int *p1,*p2,*p,a,b;scanf(“%d%d“, ,运行结果:a=5,b=9max=9,min=5,交换p1、p2的值 a、b的值没变,4.2.2指针与一维数组,例 int a 10;int *p;p=,p+1=a+1 p+i=a+i pi=a i,数组名a和指针p的区别: 1、系统只给p分配能保存一个指针值的内存区(一般4字节);而给a分配2*10字节的内存区 2、a是表示数组首地址的地址常量,不能a+;p是指针变量,可以自增运算,即p+;,数组中指针的运算 指针变量的

22、赋值运算 p= (指针变量p2值p1) 不能把一个整数p,也不能把p的值整型变量,如 int i, *p;p=1000; ()i=p; (),指针在数组中的算术运算: pi (i为整型数,d为p指向的变量所占字节数) p+, p-, p+i, p-i, p+=i, p-=i等 若p1与p2指向同一数组,p1-p2=两指针间元素个数 p1+p2 无意义,例 p指向float数,则 p+1 物理地址p+1 4,例 int a10;int *p=a3=1,1,指针变量的关系运算 若p1和p2指向同一数组,则 p1p2 表示p1指的元素在后 p1=p2 表示p1与p2指向同一元素 若p1与p2不指向同

23、一数组,比较无意义 p=NULL或p!=NULL,数组元素表示方法, 下标运算符 ai *(a+i),数组元素 :ai、 pi 、*(p+i) 、*(a+i) 数组元素地址:&ai、&pi、 p+i 、 a+i,例4.7书P79 从键盘输入10个数,然后显示在屏幕上. 【任务要求】掌握数组元素的下标法、指针法表示方法),main() int a10,*pa,i;printf(“请输入10个整数:n”);for(i=0;i10;i+)scanf(“%d”, ,a+i,4.2.3指针与二维数组,复习-对于一维数组:1)数组名array表示数组的首地址,即array0的地址;2)数组名array是地

24、址常量3)array+i是元素arrayi的地址4)arrayi *(array+i),数组元素 :ai、 pi 、*(p+i) 、*(a+i) 数组元素地址:&ai、&pi、 p+i 、 a+i,对于二维数组: (1)a是数组名,包含三个元素a0,a1,a2(2)每个元素ai又是一个一维数组,包含4个元素,int a34;,与书p71对照:,对二维数组 int a34,有 a-二维数组的首地址,即第0行的首地址 a+i-第i行的首地址 ai *(a+i)-第i行第0列的元素地址 ai+j *(a+i)+j -第i行第j列的元素地址 *(ai+j) *(*(a+i)+j) aij,a+i=&a

25、i=ai=*(a+i) =&ai0, 值相等,含义不同 a+i &ai,表示第i行首地址,指向行 ai *(a+i) &ai0,表示第i行第0列元素地址,指向列,Int a34;,a a+1,数组名,行地址 行地址+1,加了一行,列地址-元素的地址 列地址+1,加了一列,元素,*a,*(a+1), a0,a1 *a+1,a1+2,*a, *(*(a+1)+2), A00,a12,2. 二维数组的指针变量 (1) 指向二维数组元素的指针变量,例4.8书P81 请编写程序输出矩阵中的最大值 【任务要求】把二维数组当成一维来处理,#include void main( ) int a34=1,2,2

26、3,3,5,85,56,8,95,10,17,12;int i=1,max,*p;p= ,(2) 指向一维数组的指针变量(补充)定义形式: 数据类型 (*指针名)一维数组维数;例 int (*p)4;,可让p指向二维数组某一行如 int a34, (*p)4=a;,说明: 1.一维数组指针变量维数和二维数组列数必须相同 2. ( )不能少 int (*p)4与int *p4不同 3. p的值是一维数组的首地址,p是行指针,例 指向一维数组的指针变量举例补充例题代替书中例4.9 【任务要求】掌握二维数组的指针遍历方法,main() a34=1,2,23,3,5,85,56,8,95,10,17,

27、12;int i,j, (*p)4;for(p=a,i=0;i3;i+,p+ )for(j=0;j4;j+)printf(“%d “,*(*p+j);printf(“n“); , p0j,4.2.4指针数组 定义:数组中的元素为指针变量 定义形式:数据类型 *数组名数组长度说明; 例 int *p4;,指针所指向变量的数据类型,区分int *p4与int (*p)4,指针数组赋值与初始化,4.2.5指针与字符串 字符串表示形式 用字符数组存放一个字符串,例 main( ) char string=“I love China!”;printf(“%sn”,string);printf(“%sn”

28、,string+7);,字符指针指向字符类型的指针称为字符指针。字符串常量和字符数组名都具有地址特性,当把它们赋给一个字符指针后,编译器规定:1)输出字符指针就是输出指针指向的字符串;char *p; p=“I love China!”;printf(“%s”,p); 2)输出字符指针指向的目标对象,就是输出指针指向的单个字符。printf(“%c”,*p);,用字符指针指向一个字符串,例 main( ) char *string=“I love China!”;printf(“%sn”,string);string+=7;while(*string) putchar(string0);str

29、ing+;,字符指针初始化:把字符串首地址赋给string char *string;string=“I love China!”;,*string!=0,对字符串中字符的存取,可用下标法或指针法。,用字符指针指向一个字符串,*string,对使用字符指针变量和字符数组的区别 char *p; 与 char str50; 1、内存的分配str开辟连续的50字节;而cp存放字符串首地址,只分配4字节 2、赋值的方式char str20; str=“I love China!”; ()char *p; p=“I love China!”; () 3、值的改变,str-常量。P-变量,【例4.11】

30、从键盘输入两个字符串,判断第二个字符串在第一 个字符串中出现的次数。 【任务要求】掌握算法子串在母串中的方法,详细程序如下:,#include void main( ) char str150,str210,*p1,*p2; int s=0;printf(“Please input two string:n”);gets(str1); gets(str2);p1=str1;p2=str2;while(*p1!=0) if(*p1=*p2)while(*p1=*p2 ,4.5动态内存分配备注:在第六章结构体于共用体在讲,且需要补充链表的知识,4.6数组与指针综合应用1、单词统计(已讲)2、排序(

31、已讲)选择法冒泡法3、查找顺序查找二分查找4、进制转换非十进制转换成十进制数十进制转换成非十进制数5、二维数组的应用-转置(已讲),4.4.3查找,查找是指在一组数据中搜索是否存在满足给定条件数据(这个通常称为关键字)的过程。掌握查找操作的基本实现方法是编写程序的重要基础。,方法一:顺序查找,#include void main( ) int a10,x,i;printf(“输入数据到数组a中:n”);for(i=0;i9) printf(“n没有匹配的关键字n”); ,基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置

32、值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找;依此类推,逐渐缩小查找范围,直到找到或确定序列中无该值为止。,方法二:二分查找,#include void main( ) int a10,mid,front,end,x,i,find;printf(“输入数组a:n”);for(i=0;i10;i+) scanf(“%d”, ,详细程序如下:,4.4.4进制转换 1、非十进制转换成十进制数,(1556)8=183+582+581+680=(878)10,#include void main( ) char *p,s6; int f,n;p=s; n=0;printf(“请输入1个八进制数:”); gets(p);while(*p!=0) f=(int)(*p-0);if(f7|f0)printf(“请输入正确的数值!”); return;n=n*8+*p-0;p+;printf(“转换成十进制数为:%dn”,n); ,2、十进制转换成非十进制数,(78)10=(1001110)2,#include #define MAX 50 void main( ) int i=0,j=0;num=0,bMAX;printf(“请输入一个十进制数:”); scanf(“%d”, ,4.5本章小结,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报