第四章 数组与指针.ppt_第1页
第四章 数组与指针.ppt_第2页
第四章 数组与指针.ppt_第3页
第四章 数组与指针.ppt_第4页
第四章 数组与指针.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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、3,4,5; 等价于: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、

5、 用数组求Fibonacci数列前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个数中找出关键字次小的记录, 将它与第二

6、个数交换第二趟选择排序 (3)重复上述过程,共经过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

7、-1次两两比较,在第j趟比较中要进行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、二维数组的定义 定义方式: 数据类型数组名常量表达式常

8、量表达式; 例:int a34;,数组元素的存放顺序 原因:内存是一维的 二维数组:按行序优先,例 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; 两种初始化

9、方法结果均为: a00=80 a01=75 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 求二维数组中最大元素值及其行列号 【任务要求】掌握求二维数组的最值的算法,#incl

10、ude main() int a34=1,2,3,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; c

11、har s=C program; char s=C program; 上面的附初值完全相等 数组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;str

12、i=strn-i-1;strn-i-1=ch; printf(“%sn”,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,字符串输出函数p

13、uts 格式:puts(字符数组) 功能:向显示器输出字符串(输出完,换行) 说明:字符数组必须以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(“Inp

14、ut a string:”); scanf(“%s”,string); printf(“n%s”,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必

15、须足够大 拷贝时0一同拷贝 不能使用赋值语句为一个字符数组赋值,例 char str120,str220; 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(de

16、stination, blank); strcat(destination, c); printf(%sn, destination); ,结果输出:Turbo C+,字符串比较函数strcmp 格式:strcmp(字符串1,字符串2) 功能:比较两个字符串 比较规则:对两串从左向右逐个字符比较(ASCII码), 直到遇到不同字符或0为止 返值:返回int型整数,a. 若字符串1 字符串2, 返回正整数 c. 若字符串1= 字符串2, 返回零 说明:字符串比较不能用“=”,必须用strcmp,字符串长度函数strlen 格式:strlen(字符数组) 功能:计算字符串长度 返值:返回字符串实际

17、长度,不包括0在内,例 对于以下字符串,strlen(s)的值为: (1)char s10=A,0,B,C,0,D; (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); else strcpy(string,str1); if(strcmp(str2,string)0) strcpy(string,st

18、r2); printf(“n最大字符串:%s,长度:%d”,string,strlen(string); ,4.2指针,指针是语言中广泛使用的一种数据类型,运用指针编程是语言最主要的风格之一。利用指针变量可以表示各种数据结构,能很方便地使用数组和字符串,可编出精练而高效的程序。,内存单元模拟,4.2.1 地址和指针的概念,1. 地址和指针的概念 内存地址内存中存储单元的编号,以字节为单位; 变量的地址系统分配给变量内存单元的起始地址; 指针即地址,一个变量的存储地址的编号; 指针变量专门用于存储其它变量地址的变量。,这样,a和地址变量p就建立了联系。对于a变量,就可以通过指针p去间接的访问。有

19、如下关系:,2、指针变量的定义 一般形式: 数据类型 *指针名;,基类型,表示定义指针变量不是*运算符,例 int *p1,*p2; float *q ; static char *name;,合法标识符,注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值,两者关系:互为逆运算 理解,3、指针变量的使用 /p1为字符型指针 void *p2; /p2为空指针,不指向任何一种数据类型 p1= (char *)p2; /强制类型转换,将

20、p2由空型指针转换成字符型指针 零指针: #define NULL 0 char *q1=0; char *q2=NULL; 用途:避免指针变量的非法引用,p指向地址为0的单元, 系统保证该单元不作它用 表示指针变量值没有意义,5. 指针运算 指针可以参与运算,如关系、算术、自增自减等运算,但通常情况下,指针指向同一数组时,运算才具有意义。(和一位数组的关系再详讲),例补充 输入两个数,并使其从大到小输出,不改变a,b的值。,main() int *p1,*p2,*p,a,b; scanf(%d%d, ,运行结果:a=5,b=9 max=9,min=5,交换p1、p2的值 a、b的值没变,4.

21、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+;,数组中指针的运算 指针变量的赋值运算 p= (指针变量p2值p1) 不能把一个整数p,也不能把p的值整型变量,如 int i, *p; p=1000; () i=p; (),指针在数组中的算术运算: pi (i为整型数,d为p指向的变量所占字节数) p+, p-, p+i, p-i,

22、 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不指向同一数组,比较无意义 p=NULL或p!=NULL,数组元素表示方法, 下标运算符 ai *(a+i),数组元素 :ai、 pi 、*(p+i) 、*(a+i) 数组元素地址: printf(“请输入10个整数:n”); for(i=0;i10;i+)

23、 scanf(“%d”, ,a+i,4.2.3指针与二维数组,复习-对于一维数组: 1)数组名array表示数组的首地址,即array0的地址; 2)数组名array是地址常量 3)array+i是元素arrayi的地址 4)arrayi *(array+i),数组元素 :ai、 pi 、*(p+i) 、*(a+i) 数组元素地址:,与书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+

24、i=,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,23,3,5,85,56,8,95,10,17,12; int i=1,max,*p; p= ,(2) 指向一维数组的指针变量(补充) 定义形式: 数据类型 (*指针名)一维数

25、组维数; 例 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,12; int i,j, (*p)4; for(p=a,i=0;i3;i+,p+ ) for(j=0;j4;j+) printf(%d ,*(*p+j); prin

26、tf(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”,string+7); ,字符指针 指向字符类型的指针称为字符指针。 字符串常量和字符数组名都具有地址特性,当把它们赋给一个字符指针后,编译器规定: 1)输出

27、字符指针就是输出指针指向的字符串; 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); string+; ,字符指针初始化:把字符串首地址赋给string char *string; string=“I love China!”;

28、,*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】从键盘输入两个字符串,判断第二个字符串在第一 个字符串中出现的次数。 【任务要求】掌握算法子串在母串中的方法,详细程序如下:,#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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论