3. 数组、指针与字符串

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

(1)熟练掌握一维和二维数组的定义和初始化,数组元素的引用。(2)掌握一维字符数组和字符串,二维字符数组和字符串数组。(3)熟练掌握指针和地址的概念(4)熟练掌握指针变量的定义和初始化(5)熟练掌握通过指针引用指向实体(6)掌握通过指针变量引用数组元素及处理字符串(7)掌握指针数组和指向指针的指针(二级指针)第三讲数组、指针和字符串数组C语言中,数组是一个构造数组类型。数组是一组相同类型(基本类型或结构类型)的变量的集合,数组中的每个数据称为数组的元素,元素在数组中按线性顺序排列。用数组名代表逻辑上相关的一批数据,每个元素用下标变量来区分,下标变量代表元素在数组中的位置。C语言中的数组的分类:按元素的数据类型可分为:整型数组、字符数组、实型数组、结构体数组、共用体数组、指针数组等。按数组维数可分为:一维数组、二维数组、多维数组。数组在内存中占用一片连续的存储单元,最低地址对应于数组的第一个元素,最高地址对应于最后一个元素。数组定义:一维数组:类型说明符数组名[常量表达式];二组数组:类型说明符数组名[常量表达式1][常量表达式2];例如:inta[10],x[3][4];从C语言二维数组的定义可以看出,一个二维数组也可以分解为多个一维数组。例如:inta[3][4]即:a[0][0],a[0][1],a[0][2],a[0][3]a[1][0],a[1][1],a[1][2],a[1][3]a[2][0],a[2][1],a[2][2],a[2][3]二维数组是按行排列的,即按行顺次存放,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中的元素也是依次存放。1.C语言中规定数组的下标从0开始,方括号中常量表达式表示数组元素的个数。2.数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。3.数组名的书写规则应符合标识符的书写规定。4.数组名不能与其它变量名相同。5.允许在同一个类型说明中,说明多个数组和多个变量。6.不能在方括号中用变量来表示元素的个数,但可以是符号常数或常量表达式。7.不允许对数组的大小作动态定义。注意:初始化定义同时赋初值例如:inta[10]={1,2,3,4,5,6}intx[]={3,5,7,9,11}使用赋值语句逐个赋值注意:1.可以只给前面部分元素赋初值,其余元素自动赋0。2.只能给元素逐个赋值,不能给数组整体赋值。3.二维数组可按行分段赋值,也可按行连续赋值,未赋值的自动取零。4.当{}中值的个数多于元素个数时,系统出错。二维数组可按行分段赋值,也可按行连续赋值。1.按行分段赋值可写为int[3][3]={{80,75,92},{61,65,71},{59,63,70}};2.按行连续赋值可写为inta[5][3]={80,75,92,61,65,71,59,63,70};这两种赋初值的结果是完全相同的。数组引用:数组名[下标]数组名[下标1][下标2]指针法引用:一维数组a,*(a+i)等价于a[i]二维数组a*(*(a+i)+j)等价于a[i][j]注意:1、只能通过下标变量逐个引用数组元素,而不能一次引用整个数组的全部元素。2、数组说明的方括号中给出的是某一维的长度;而数组引用中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。练习判断题(P18)34.C语言中的数组下标从0开始,当引数组元素超过所定义的范围,将出来编译错误。38.假定int类型变量占用两个字节,若有定义:intx[10]={0,2,4};,则数组x在内存中所占字节数是6。填空题(P21)(18)引用二维数组a第i行、第j列的元素(i、j为0表示第1行、第1列),可以写作:或。(20)数组声明为“floatx[7][5];”若x[6][4]是内存中从x[0][0]数起的第35个元素,则x[4][4]是第个元素。单项选择题(P22)6.下列数组声明语句中,正确的是()。A、inta[]={1,2,,4,5};B、chara[5]={A,B,C,D,E};C、inta[5]={1,2};D、chara[5]=Hello;√√7.数组声明语句为“inta[6];”,输入数组所有元素的语句应为()。A、scanf(%d%d%d%d%d,a[6]);B、for(inti=0;i6;i++)scanf(%d,a+i);C、for(inti=0;i6;i++)scanf(%d,*a+i);D、for(inti=0;i6;i++)scanf(%d,a[i]);程序填空(P26)7.输入10个数,输出其中与平均值之差的绝对值最小的数。#includestdio.h(1)voidmain(){floata[10],s,d,x;inti;for(i=0;i10;i++)(2);(3)for(i=0;i10;i++)s+=a[i];s/=10;d=fabs(a[0]-s);(4);for(i=1;i10;i++)if(fabs(a[i]-s)d){d=(5);x=a[i];}printf(%f,x);}(1)#includemath.h(2)scanf(“%d”,&a[i])(3)s=0;(4)x=a[0](5)fabs(a[i]-s)8.输出如下形式的二项式系数列标。要求表的行数运行时输入,若小于1或者大于10则重新输入。#includestdio.hvoidmain(){inta[10][10]={{0}},i,j,n;while((1),n1||n10);for(i=0;in;i++){a[i][0]=1;(2);}for(i=2;in;i++)for(j=1;ji;j++)a[i][j]=a[i-1][j]+(3);for(i=0;in;i++){for(j=0;j=i;j++)printf(%4d,a[i][j]);(4);}}11112113311464115101051(1)scanf(“%d”,&n)(2)a[i][i]=1(3)a[i-1][j-1](4)printf(“\n”)地址:内存单元的编号,通常一个字节(1B)一个编号。指针:内存单元的地址。内存数据的访问方式:(1)直接访问——按变量名存取变量(2)间接访问——将变量的地址存放在另一个变量(指针变量),通过指针变量来访问。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。指针的概念……..305060变量i变量j变量k2000200420022000指针变量ip地址严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针变量的目的是为了通过指针去访问内存单元。注意:变量的指针——变量的地址例:&a为变量a在内存单元的存放地址,也称变量a的指针指针变量——存放地址的变量指向变量的指针变量——一个指针变量存放变量a的地址,则称该指针变量为指向变量a的指针变量。例:inta=10;int*pa;pa=&a;10a&apa指针变量的定义其一般形式为:类型说明符*变量名;*表示这是一个指针变量,变量名即为定义的指针变量名;类型说明符表示指针变量所指向的变量的数据类型(基类型)。例如:int*p1;表示p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。指针变量的定义staticint*p2;/*p2是指向静态整型变量的指针变量*/float*p3;/*p3是指向浮点变量的指针变量*/char*p4;/*p4是指向字符变量的指针变量*/再如:注意:一个指针变量只能指向同类型的变量,如p3只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。这是由于指针的移动和运算都与基类型有关。指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,不能赋予任何其它数据,否则将引起错误。C语言中提供了地址运算符&来表示变量的地址。其一般形式为:&变量名;例如:&a变示变量a的地址,&b表示变量b的地址。变量a本身必须预先说明。指针变量的赋值(1)指针变量初始化的方法:inta;int*p=&a;设有指向整型变量的指针变量p,如要把整型变量a的地址赋予p可以有以下两种方式:(2)赋值语句的方法:inta,*p;p=&a;指针变量可以进行某些运算,但其运算的种类是有限的,只能进行赋值运算和部分算术运算及关系运算。1.指针运算符(1)取地址运算符&单目运算符,其结合性为自右至左,其功能是取变量的地址。例:&a即取变量a的地址(2)取内容运算符*单目运算符,其结合性为自右至左,其功能是用来表示指针变量所指的变量。在*运算符之后跟的变量必须是指针变量。指针变量的运算(引用)例:voidmain(){inta=5,*p=&a;printf(%d,*p);}注意:指针运算符*和指针变量说明中的指针说明符*意义是不相同。在指针变量说明中,*是类型说明符,表示其后的变量是指针类型。表达式中出现的*则是一个运算符用以表示指针变量所指的变量。两个*的意义相同么?若有定义:inta,*p=&a(1)&*p表示:p(a的地址)(2)*&a表示:a(3)(*p)++相当于a++(4)*p++相当于*(p++),即先取p所指向变量的值,然后,让p指向下一个存储单元。(5)*++p相当于*(++p)即先让p指向下一个存储单元,然后再取p所指向变量的值。指针变量的赋值运算有以下几种形式:①把一个变量的地址赋予指向相同数据类型的指针变量。例如:inta,*pa;pa=&a;/*把整型变量a的地址赋予整型指针变量pa*/②把一个指针变量的值赋予指向相同数据类型变量的另一个指针变量。2.赋值运算voidmain(){inta=1,b=2,*pa=&a,*pb=&b;pa=pb;printf(a=%d\nb=%d\n*pa=%d\n*pb=%d\n,a,b,*pa,*pb);}例如:1a&b&bpb2bpa执行pa=pb;1a&a&bpb2bpa初始化若改为*pa=*pb;有何不同?voidmain(){inta=1,b=2,*pa=&a,*pb=&b;*pa=*pb;printf(a=%d\nb=%d\n*pa=%d\n*pb=%d\n,a,b,*pa,*pb);}例如:1a&a&bpb2bpa初始化2a&a&bpb2bpa执行*pa=*pb;③把数组的首地址赋予指向数组的指针变量。例如:inta[5],*pa;pa=a;(C语言规定数组名表示数组的首地址)也可写为:pa=&a[0];数组第一个元素的地址也是整个数组的首地址,可赋予pa指针变量。当然也可采取初始化赋值的方法:inta[5],*pa=a;④把字符串的首地址赋予指向字符类型的指针变量。例如:char*pc;pc=Clanguage;或用初始化赋值的方法写为:char*pc=CLanguage;这里应说明的是并不是把整个字符串装入指针变量,而是把存放该字符串的字符数组的首地址装入指针变量。输出字符串是可以使用%s格式字符串,即语句printf(“%s”,pc);指针变量可以赋予0值,p=0表明p是空指针,它不指向任何变量在头文件stdio.h中有:#defineNULL0因此在C程序中常使用int*p=NULL;让指针变量p为空指针。对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。说明:voidmain(){inta,b,*p,*p1=&a,*p2=&b;scanf(%d%d,p1,p2);if(ab){p=p1

1 / 81
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功