C程序设计课件4.1_第1页
C程序设计课件4.1_第2页
C程序设计课件4.1_第3页
C程序设计课件4.1_第4页
C程序设计课件4.1_第5页
已阅读5页,还剩24页未读, 继续免费阅读

下载本文档

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

文档简介

掌握一维数组、二维数组和指针数组的定义和初始化掌握数组元素的下标法和指针法引用掌握C语言中字符串的处理方法掌握常用字符串处理函数的使用能利用数组解决向量、矩阵等实际应用问题教学目标重点难点重点:一维数组、二维数组的定义、初始化和元素引用,常用字符串处理函数的使用。难点:指针数组和数组元素的指针法引用1.数组:2.数组元素:3.元素表示:4.数据类型:5.数组分类①按数组元素数据类型:数值数组、字符数组、指针数组和结构数组等。②按维数:一维、二维和多维。类型相同的变量序列数组必须先定义后使用序列中的每个变量称为数组元素构造类型数组元素用一个统一的标识符“数组名”和序号“下标”来表示,下标从0开始。一维数组及指针1.一维数组的定义一维数组定义的一般形式

类型标识符

数组名[常量表达式]数组长度数组元素的类型符合标识符取名规则

如:shortinta[6];定义了一个一维数组,数组名为a,数据类型为短整型,数组中有6个元素,分别是:a[0],a[1],a[2],a[3],a[4],a[5]。一、一维数组的定义和初始化如:#definen6shortinta[n];

①不允许对数组的大小作动态定义。③C语言对数组元素的下标不作越界检查。如:shortinta[6];a[6]=10;/*使用a[6]并不作错误处理*/②数组元素的下标从0开始。(√)如:shortinta[6];

数组元素:a[0],a[1],a[2],a[3],a[4],a[5]。④可以同时定义多个数组,也可以同时定义数组和变量。如:shortinta[6],b[10];floatc[20],d,f;intn=6;shortinta[n];

(×)说明数组所占字节数=sizeof(类型标识符)*数组长度a如:shortinta[6];12个字节⑤系统为数组分配的存储空间是连续的,数组元素按其下标递增的顺序依次占用相应字节的内存单元。a[0]a[1]a[2]a[3]a[4]a[5]数组名代表数组在内存首地址,是地址常量在定义数组时,对数组的全部元素或部分元素赋初值,称为数组的初始化。2.一维数组初始化(1)全部元素初始化(此时可以省略数组长度)如:inta[10]={1,2,3,4,5,6,7,8,9,10};inta[]={1,2,3,4,5,6,7,8,9,10};初始化时省略长度,数组长度就是{}内的值个数数组元素a[0]至a[9]的值依次为:1,2,3,4,5,6,7,8,9,10

部分元素初始化时,数组的长度不能省略,并且是依次赋值给前面的元素,没有被赋值的数组元素,数值型数组的值为0,字符型数组的值为'\0'。#include"stdio.h"voidmain(){inta[6]={1,2},i;for(i=0;i<6;i++)printf("%4d",a[i]);

}120000运行结果:程序1☞【例】写出下列程序的运行结果。(2)部分元素初始化(此时数组长度不能省略)如:inta[6]={1,2};二、一维数组元素的下标法引用#include"stdio.h"voidmain(){inta[10]={1,2,3,4,5,6,7,8,9,10},i=3;

printf("%3d%3d%3d%3d",a[++i],a[i],a[3*2],a['b'-'a']);}运行结果:5472数组元素的使用与同类型的变量相同程序2☞一维数组元素的下标表示形式数组名[表达式]其中,表达式的类型任意,一般为算术表达式,其值为数组元素的下标。【例】写出下列程序的运行结果。1假设输入:12345678910↙i【例】将整型数组a中存放的10个整型数逆序存放。#include"stdio.h"voidmain(){inta[10],i,j,t;

}/*输入数据*//*逆置*//*输出数据*/②数值型数组值只能单个元素输出for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0,j=9;i<j;i++,j--){t=a[i];a[i]=a[j];a[j]=t;}for(i=0;i<10;i++)printf("%4d",a[i]);程序3☞①数值型数组值只能单个元素输入scanf("%d",a);printf("%d",a);××0123456789i2345678910j【例】从键盘输入10个整型数并存放到数组中,找出其中的最大值并输出。#include"stdio.h"voidmain(){inta[10],i,max;/*输入数据*/for(i=0;i<10;i++)scanf("%d",&a[i]);/*找最大值*/max=a[0];for(i=1;i<=9;i++){if(max<a[i])max=a[i];}

/*输出最大值*/printf("max=%d\n",max);}程序4☞

数组首地址

C语言规定,数组存储空间的首地址存放在数组名中数组元素地址

&数组名[下标]数组元素a[0]的地址:_________数组元素a[3]的地址:_________数组名是地址常量对数组名用取地址符“&”进行运算没有意义

三、一维数组的指针如:shortinta[6];aa[0]a[1]a[2]a[3]a[4]a[5]&a[0]或a&a[3]定义与指向变量的指针变量的定义相同#include"stdio.h"voidmain(){shortinta[6]={1,2,3,4,5,6},*p,*q;p=&a[3];

q=a;

printf("%3hd%3hd\n",*p,*q);}指针变量的类型必须与它指向的数组元素的类型一致pq程序5☞1.指向一维数组元素的指针变量如:shortinta[6]={1,2,3,4,5,6};

shortint*p=&a[3],*q=a;运行结果:【例】写出下列程序的运行结果a[0]1a[1]2a[2]3a[3]4a[4]5a[5]6a

41①赋值运算

如:shortint*p,a[6];

p=&a[2];②指向数组元素的指针可以加(减)一个整型数

假设p是指向数组元素的指针,n是一个整型数

p+n:指向p所指向元素后的第n个数组元素p-n:指向p所指向元素前的第n个数组元素如:若有定义shortinta[6],*p=&a[2];

a+3指向_______

p-1指向_______

p+2指向_______

pa+3p-1p+2a[1]a[4]a[3]2.指针运算a[0]1a[1]2a[2]3a[3]4a[4]5a[5]6a若有定义:inta[6],*p=a,*q=a+2;,则:①数组元素a[i]的地址有几种表示方式?②q+2是哪个元素的地址?运行结果:③指向数组元素的指针变量可以进行自加自减运算p++或++p:等价于p=p+1,自加后指向原来指向元素的后一个元素p--或—p:等价于p=p-1,自减后指向原来指向元素的前一个元素数组名是常量,不能进行自加自减运算#include"stdio.h"voidmain(){,*p,*q;

p=&a[3];

q=p++;

printf("%3d%3d\n",*p,*q);}/*等价于q=p;p=p+1;*/【例】写出下列程序的运行结果程序6☞pa[0]1a[1]2a[2]3a[3]4a[4]5a[5]6aqinta[6]={1,2,3,4,5,6}54若有定义:shortinta[6],*p=&a[2],*q=&a[4];p-a的值为_____

q-p的值为_____

若有定义:shortinta[6],*p=&a[2],*q=&a[4];p>a的值为_____q>a+4的值为_____④指向同一个数组中元素的两个指针可以进行减运算

含义:

两个指针之间的数组元素个数⑤指向同一个数组中元素的两个指针可以进行关系运算pqa[0]1a[1]2a[2]3a[3]4a[4]5a[5]6a指向同一个数组中元素的两个指针不能进行加运算2210若有定义:inta[6],*p=a;数组名法指针变量法下标法四、一维数组元素的指针法引用&a[i]、a+i、p+i、&p[i]等价a[i]、*(a+i)、*(p+i)、p[i]等价(数组元素a[i]的地址)(数组元素a[i])1.数组名法引用用数组名引用数组元素的一般形式*(数组名+表达式)其中,表达式类型任意,一般为算术表达式,其值为数组元素的下标。如:*(a+3-1)表示数组元素a[2]

【例】将整型数组a中的10个整型数逆序存放。#include"stdio.h"voidmain(){inta[10],i,j,t;for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0,j=9;i<j;i++,j--){t=a[i];a[i]=a[j];a[j]=t;}for(i=0;i<10;i++)printf("%4d",a[i]);}{t=*(a+i);*(a+i)=*(a+j);*(a+j)=t;}

printf("%4d",*(a+i));scanf("%d",a+i);下标法数组名法程序7☞编译时系统自动将下标法引用改为数组名法引用2.指针变量法用指针变量引用数组元素的一般形式

*(指针变量+表达式)或指针变量[表达式]其中,指针变量为指向一维数组元素的指针变量;表达式类型任意,一般为算术表达式。

若有定义:inta[10],*p=a+3;*p等价于___________________

*(p+2+2)等价于_________________

p[2]等价于__________________

p[1]-p[-1]等价于______________________apa[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[3]或*(a+3)a[7]或*(a+7)a[5]或*(a+5)a[4]-a[2]或*(a+4)-*(a+2)p#include"stdio.h"voidmain(){inta[10],*p,*q,t;for(p=a;p<a+10;

p++)scanf("%d",p);for(p=a,q=a+9;

p<q;p++,q--){t=*p;*p=*q;*q=t;}for(p=a;p<a+10;p++)printf("%4d",*p);}p假设输入:

12345678910↙【例】将整型数组a中的10个整型数逆序存放。程序8☞指向数组元素的指针变量也可用下标法表示数组元素,程序如何修改?

0123456789q12345678910/*输入数据*//*逆置*//*输出数据*/⑩--(*p)/*先将p指向的元素值减1,然后再用p指向的元素值*/使用指针变量引用数组元素时,应注意下列情况①*(p++)/*先使用p指向的元素值,然后p指向下一个元素*/②*(++p)/*p先指向下一元素,然后用p指向的元素值*/③*(p--)/*先用p指向的元素值,然后p指向上一个元素*/④*(--p)/*p先指向上一元素,然后用p指向的元素值*/⑤*p++/*与*(p++)等价*/⑥*p--/*与*(p--)等价*/⑦(*p)++/*先用p指向的元素值,然后将p指向的元素值加1*/⑧(*p)--/*先用p指向的元素值,然后将p指向元的素值减1*/⑨++(*p)/*先将p指向的元素值加1,然后再用p指向的元素值*/#include"stdio.h"voidmain(){inta[]={1,3,6},*p;p=&a[1];printf("*(p++)=%d\n",*(p++));printf("*p=%d\n",*p);p=&a[1];printf("*(++p)=%d\n",*(++p));printf("*p=%d\n",*p);p=&a[1];printf("*p++=%d\n",*p++);printf(“*p=%d\n",*p);

p=&a[1];printf("(*p)++=%d\n",(*p)++);printf("*p=%d\n",*p);p=&a[1];

printf("++(*p)=%d\n",++(*p));printf("*p=%d\n",*p);}*(p++)=3*p=6*(++p)=6*p=6*p++=3*p=6

(*p)++=3*p=4++(*p)=5*p=5136a【例】写出下列程序的运行结果。p运行结果ppp45程序9☞1.设有定义:inta[10],*p=a;,对数组元素的正确引用是()①a[p]②p[a]③*(p+2)④p+2③练习题一、单项选择题4.运行下列程序的输出结果是()

#include"stdio.h"voidmain(){inta[]={1,2,3,4,5},i,*p=a+2;printf("%d",p[1]-p[-1]);}①出错,因下标不能为负值②1③2④33.设有定义:inta[10],*p=a+6,*q=a;,则下列运算哪种是错误的()①p-q②p+3③p+q④p>q2.若有如下定义,则值为3的表达式是()

inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;①p+=2,*(p++)②p+=2,*++p③p+=3,*p++④p+=2,++*p①③③二、程序填空题1.下列程序的功能是输出数组s中最大元素的下标。

#include"stdio.h"

voidmain(){intk,i;ints[]={3,-8,7,2,-1,4};for(i=0,k=i;i<6;i++)if(s[i]>s[k])

;printf("k=%d\n",k);}k=i2.下列程序的功能是输入N个实数,然后依次输出前l个实数和、前2个实数和、…、前N个实数和。#include"stdio.h"#defineN10voidmain(){floatf[N],x=0.0;inti;

for(i=0;i<N;i++)scanf("%f",

);

for(i=1;i<=N;i++){

;printf("sumofNO%2d---------%f\n",i,x);}}x=x+f[i-1]&f[i]3.以下程序的功能是将数组x中各相邻两个元素的和依次存放到a数组中。#include"stdio.h"voidmain(){intx[10],a[9],i;printf("往数组x中读入10个整数:");for(i=0;i<10;i++)scanf("%d",

);for(i=1;i<10;i++)a[i-1]=x[i]+

;for(i=0;i<9;i++)printf("%d",a[i]);}4.以下程序统计从终端输入的字符中大写字母的个数,num[0]中统计字母A的个数,num[1]中统计字母B的个数,其它依次类推.用#号结束输入。#include<stdio.h>voidmain(){intnum[26]={0},i;charc;while((c=

)!='#')if(

)num[c-'A']+=1;for(i=0;i<26;i++)

printf("%c:%d\n",i+'A',num);}&x[i]c>='A'&&c<='Z'x[i-1]getchar()2.下列程序的运行结果是()

#include"stdio.h"voidmain(){inta[]={2,4,6,8,10};inty=1,x,*p;p=&a[1];for(x=0;x<3;x++)y+=*(p+x);printf("%d\n",y);}193.下列程序的运行结果是()#include"stdio.h"voidmain(){inti,n[6]={0};

for(i=1;i<=4;i++)n[i]=n[i-1]*2+1;pri

温馨提示

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

评论

0/150

提交评论