第4章指针与数组

上传人:公**** 文档编号:567926653 上传时间:2024-07-22 格式:PPT 页数:113 大小:2.38MB
返回 下载 相关 举报
第4章指针与数组_第1页
第1页 / 共113页
第4章指针与数组_第2页
第2页 / 共113页
第4章指针与数组_第3页
第3页 / 共113页
第4章指针与数组_第4页
第4页 / 共113页
第4章指针与数组_第5页
第5页 / 共113页
点击查看更多>>
资源描述

《第4章指针与数组》由会员分享,可在线阅读,更多相关《第4章指针与数组(113页珍藏版)》请在金锄头文库上搜索。

1、第第4章章 指针与数组指针与数组第一节第一节 一维数组一维数组第二节第二节 二维数组二维数组第三节第三节 字符数组与字符串字符数组与字符串第四节第四节 指针数组指针数组指针小结指针小结C语言程序设计语言程序设计 龙昭华主编1 /113课件制作:刘达明课件制作:刘达明 023-66834110睫豹序刹裔谗屯舒尸铣咐辉馒解曳气簿铝警唯湖伦丢倒旬琐睦馈就婶砒桔第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)2 /113 迄今为止,我们使用的都是属于基本类型,如:整型、字符型、实型等类型的数据。而C还提供了构造类型,如:数组类型、结构体类型、公用

2、体类型等。构造类型数据是由基本类型数据按一定规则组成的,因此有些书称它们为“导出类型”。 在程序设计中,常常需要处理大量同类型的相关数据,如每个学生的成绩记录,多个相同类型数据的排序等。这类数据在计算机语言中可以通过数组来表示。所谓数组数组就是具有相同数据类型的有序集合。 在C语言中,数组具有以下几个特点: 数组的所有元素使用一个共同的名字,称为数组名数组名,数组名使用标识符来表示。每个数组元素的使用由数组的下标来确定。 数组元素的个数必须在定义时确定,程序中不可改变。 在C语言中,数组下标是从0开始,到数组元素个数减1结束的。 同一数组中的每一元素具有相同的数据类型相同的数据类型(可以是基本

3、类型或构造类型等)。 同一数组在内存中占据一段连续的存储单元连续的存储单元。 数组中元素的作用相当于简单变量。 数组必须先定义后使用。课件制作:刘达明课件制作:刘达明 023-66834110喘沂熬疽句盏逾柯惜毅胚厘运瞩捏凭曙盲广河伪旗坎掂臣刺驰呈同旁酵巴第4章指针与数组第4章指针与数组一、一、一维数组的定义和引用一维数组的定义和引用第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)3 /1131 1、一维数组的定义、一维数组的定义 一维数组是指只有一个下标的数组元素所组成的数组。一维数组的定义方式为: 类型型说明符明符 数数组名名 常量表达式常量表达式 ; 例如:int

4、 a10; 它表示数组名为a,此数组有10个元素,分别为a0、a1、a2、a3、a4、a5、a6、a7、a8、a9。 又如:存放30个学生的数学成绩,用一维数组定义如下:int grade30; 其元素分别为:grade0,grade29共30个。课件制作:刘达明课件制作:刘达明 023-66834110盾匹噶揣锌彰促戒郊械惟工危辑蜂芳订设醛骆筏设算浆享弗熟帅恳怀饼萤第4章指针与数组第4章指针与数组一维数组的定义说明一维数组的定义说明第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)4 /113 数组名数组名定名规则和变量名相同,遵循标识符标识符定名规则。它表示各数组元素

5、的统一名字,用以唯一标识数组。 数组名后是用方括号方括号的常量表达式常量表达式,不能用圆括号代替。 如int a(20);是错误的。 常量表达式的值表示数组中所包含的元素的个数,即数组的长度。 如int a20;表示数组a有20个元素,分别为a0、a1、a19。 注意不能使用数组元素a20。 常量表达式中可以包括常量常量和符号常量符号常量,不能包含变量。即在C语言中不允许对数组进行动态定义,数组的大小不会随着程序运行中的变化而改变。 错误定义:int n;scanf(“%d”,&n); float bn;。 正确定义:#define N 30 float bN; int i10;。 类型说明符

6、表示数组元素具有的数据类型,可以是int、 short、long、char、unsigned、float、double等。 相同类型的数组可以在同一个类型说明符下一起说明,互相间用“,”隔开。如:int a4,b10,c20;。 注意:注意:数组必须先定义,后使用。课件制作:刘达明课件制作:刘达明 023-66834110捂晴惺咸离纫傲米亏鹏羞睛毋伟绷曲侈解受阔突圭僳淡蜡做配豹驹撰粟捆第4章指针与数组第4章指针与数组2 2、一维数组的引用、一维数组的引用第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)5 /113 数组的具体使用对象是其中的数组元素。在一个数组定义好后,

7、在内存中分配一组连续的存储空间。如:int a5; 存储方式见右图。 数组元素的引用格式为: 数组名数组名 下标下标 ; 这里的下标与数组定义时不同,不仅可以是整型常量或整型表达式,还可以是含有已赋值变量的整型表达式。数组的下标从0开始算起。 如:b0=b5+b7-b2*3。 又如:int i15; int n=3; i0=-10; i5=6; in*4=9;a0=1内存用户数据区内存用户数据区a1=3a2=2592000200220042008a3=-1a4=-102006000000010000000011110110111111110000001100000000000000110000

8、00011111111111111111课件制作:刘达明课件制作:刘达明 023-66834110递涪肿撤学辨镣溅吮久漠嚷孔惊泄顺嫡丧美冻厅岗晰萨抖尿梢渠榜让羹磷第4章指针与数组第4章指针与数组一维数组的引用说明一维数组的引用说明第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)6 /113 数组元素和普通基本型变量一样的使用,可出现在C语言表达式中的任何地方。 C语言规定只能逐个引用数组元素,而不能一次引用整个数组。 C语言不提供数组下标越界的保护,设计时要注意。 如:int b5; 只能有效引用b0、b1、b2、b3、b4。 如果程序中出现b5 ,这时C的编译系统不会

9、出错,但b5的值是 不确定的。课件制作:刘达明课件制作:刘达明 023-66834110高撩半早娜队邻井芹汪聚滥确棘杉连冶牛疯帝苟连葡疏讹钮乙俗亥烷码扯第4章指针与数组第4章指针与数组3 3、一维数组的初始化、一维数组的初始化第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)7 /113a0=1内存用户数据区内存用户数据区a1=3a2=2592000200220042008a3=-1a4=-10200600000001000000001111011011111111000000110000000000000011000000011111111111111111 数组在定义

10、后,它所占有的存储单元中的值是不确定的,引用数组元素之前,必须保证数组的元素已经被赋以确定的值。 对数组元素的初始化可以用以下方法实现: 通过赋值语句或输入语句对数组中的元素赋值。 在数组定义时对数组中的元素赋值。对数组元素赋值的方法是从数组的第一个元素开始依次给出初始表,表中各值之间用逗号分开。一般格式为: static static = 如:int a5=1,3,259,-1,-10; static int b5=1,3,259,-1,-10; char word5=a,b,c,d,e;课件制作:刘达明课件制作:刘达明 023-66834110撅若呀坡隘室闸巧质兆晤瀑州避天揍袍棍炬瞅石彝应

11、病翰狸柴言湖猿圾沙第4章指针与数组第4章指针与数组一维数组的初始化说明:一维数组的初始化说明:第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)8 /113 是用逗号分隔的数据。 若对数组中的所有元素都赋初值,可不必指出元素个数,即可以不指定数组长度。 如: int a=1,3,259,-1,-10; 也表示数组a有5个元素。它等价于: int a5=1,3,259,-1,-10; 也等价于 a0=1;a1=3;a2=259; a3=-1;a4=-10。 而没有给出数组长度的赋初值,即使后面每个元素的初值全是0,也要写出来。 如:int b=1,2,3,0,0,0; 认为

12、是6个元素的数组,它等价于: int b6=1,2,3;。 中数据的类型必须与所指定的数据类型一致。 在C语言中,数组元素的下标值依次为0、1、2、,在n个元素组成的一维数组中,最后一个元素的下标为n-1。课件制作:刘达明课件制作:刘达明 023-66834110辐准线车溅再蜘眺洽疽砍梳锈陕氧清倪机茬官床痢盏潜箕裙偏旋航抹板克第4章指针与数组第4章指针与数组一维数组的初始化说明(续):一维数组的初始化说明(续):第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)9 /113 C语言规定对数组进行置初值时,如果是静态存储(static为关键字)数组和外部存储(extern)

13、数组。在数组不赋初值时,系统会对所有数组元素自动赋以0值或0值。 如:static int a3; 等价于 static int a3=0,0,0; 。 如果只定义int a5;而不赋初值时,则各元素的值是不确定的。 对数组的全部元素都赋0为初值,可以写成:int a5=0,0,0,0,0; 而不能写成:int a5=0*5; 。 可以只给数组中的前面一部分元素赋初值,后面没有赋初值的元素系统自动赋以0值或0值。 如:int a5=1,2,3; 等价于:int a5=1,2,3,0,0; 也等价于:int a=1,2,3,0,0; 。课件制作:刘达明课件制作:刘达明 023-66834110稍

14、潘啊质砸累墙堆穆毯篮减那绣金壳铆红鲸踢帜粪很衙料仿嫁幻管折贩揣第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)10 /113 1 1、指向基本数据类型变量的指针变量、指向基本数据类型变量的指针变量二、二、指向指向一维数组的指针变量一维数组的指针变量3i变量名变量名变量值变量值存储单元存储单元变量变量i=3内存用户数据区内存用户数据区2000变量变量j=6变量变量k=9变量变量i_pointer200020022004301000001001000000000000001100000000000001100000000020002000i_

15、pointeri30103间接访问:间接访问:2000i3直接访问:直接访问: int i,j,k,*i_pointer=&i; i=3; j=6; k=9;执行执行i_pointer+后,后, i_pointer已不再指向已不再指向i了,了,而是指向了下一个而是指向了下一个j,但在这里这样用无意义。,但在这里这样用无意义。int i;给变量i分配2个字节的存储单元i=3; 在i的存储单元中的值为3。课件制作:刘达明课件制作:刘达明 023-66834110虏臣虚扬翔脸无妥赐筹焕杜医髓巩敲宵盆导拘店蚂粟港气籽收懂般列敞寝第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第

16、四章 指针与数组)指针与数组)11 /113200032000i_pointeri3010*i_pointer&b&bp2b* p2&a&ap1a* p1指向基本数据类型变量的指针变量指向基本数据类型变量的指针变量( (续续1)1)int i,*i_pointer;i_pointer=&i;若:i=3;则:*i_pointer也为3。float a,*p1;p1=&a;char b,*p2;p2=&b;指针与指针变量通过指针与指针变量通过&建立联系:建立联系:int i,*pi,*pi1;pi=&i; /* 指针变量pi已指向变量i */pi1=pi; 这时*pi和*pi1都相当于变量i。即:

17、*pi=3; 或*pi1=3; 等价于 i=3;char c,*pc;pc=&c; /* 指针变量pc已指向变量c */这时*pc相当于变量c。即:*pc=3; 等价于 c=3;float f,*pf;pf=&f; /* 指针变量pf已指向变量f */这时*pf相当于变量f。即:*pf=3.6; 等价于 f=3.6; 错误赋值:错误赋值:pf=1000; 但pf=NULL除外。间接运算符间接运算符*与取地址运算符与取地址运算符&同级,同级,且右结合且右结合。如:*&i=3; 等价于 i=3;或*(&i)=3; 又:int a,*p=&a; 则:&*p等价于&(*p)或&a都表示变量a的地址。而

18、*&a则与*p等价,都表示变量a的内容。课件制作:刘达明课件制作:刘达明 023-66834110乏离袋另持诵衣谈肠肪叮谭信蜕殷困讽绍溉觅冒篓肄哼氨溃雍茂蒋揍梗盏第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)12 /113指针变量的运算:指针变量的运算: 指针变量是一个变量,因此可以进行某些运算。但指针的本质是一个地址,其运算具有一些特别的性质,不能用普通变量的规则运算来作为指针运算的方式。 指指针变量加变量加( (减减) )一个整数的一个整数的算算术运算运算:只有:加、减(+、-、+ +、- -)运算。 +、+ +代表指针前移,-、-

19、 -代表指针后移。指针变量每加(或减)1,就指向它指定的数据类型的下一个(或上一个)元素的位置。C C语言规定语言规定,一个指针变量加(减)一个整数并不是简单地将指针变量的原值加(减)一个整数,而是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加(减)。如:p+i(p是指针变量,i是整数),代表的地址计算:p+c*i(c为指针变量所指向的数据类型所占内存的字节数)。运算:p+、p-,+p,p-=i,p+=i,p=p+i,p=p-i等(这里i表示整型数据)。这些运算的结果仍为指针结果仍为指针。如: int a,b,c,d,*p; p=&b; 当执行p+;(或p=p+1;)

20、时,p就指向变量c,相当于p=&c;而执行p-时,p就指向变量a,相当于p=&a。又如:float e,f,x,y,z,*p2; p2=&x; 当执行p2=p2+2;(或p+=2;)时,p2就指向变量z,相当于p=&z;而执行p2=p2-2;(或p-=2;)时,p2就指向变量e,相当于p=&e。 两个指两个指针变量之量之间的的算术算术运算运算:只有减法(-)运算。只有指向同一数组的两个指针变量之间才能进行这种运算,否则两个指针变量之间的运算毫无意义(但在程序中不会报错)。指向同一数组的两个指针变量之差,是两个指针之间的元素个数。结果为个数结果为个数。指向基本数据类型变量的指针变量指向基本数据类

21、型变量的指针变量( (续续2)2)课件制作:刘达明课件制作:刘达明 023-66834110囤讥艇编曝选擒警川玲屡拂酵讥灵舅付展降狰靛录廖柒巷犬枪伍僚谈牺闺第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)13 /113如:p1=&a1;p2=&a4;则p2-p1=4-1=3,表示p1与p2之间有3个数组元素。而p1-p2=-3。注意:注意:两个指针变量进行加法运算,如p1+p2,并无实际意义,并且是非法的指针运算。 两个指两个指针变量之量之间的的比较比较( (关系关系运算运算) ):两个指针之间关系运算是比较两个指针所指向的地址关系,其运

22、算符有:=、!=、=。比较运算结果为:真真(1)(1)或假或假(0)(0)。如: p1=&a1;p2=&a4; 则:p1=p2为假(0),p1!=p2为真(1),p1p2为假。p1=p2;p1=p2; 表示p1、p2指向同一数组元素地址。p1p2;p1p2; 表示p1比p2的地址值大,处于高地址位置。p1p2;p1p2; 表示p1比p2的地址值小,处于低地址位置。注意:注意:只有两个指针指向同一数组的元素时,进行比较才有意义,这时指向前面的元素的指针变量“小于”指向后面的元素的指针变量。特别注意:如果两个指针变量不是指向同一数组,则这两个指针变量进行比较毫无意义(但在程序中不会报错)。 指针标

23、量可以指向一个空值:指针标量可以指向一个空值:即该指针变量不指向任何变量。在stdio.h文件中有如下定义:#define NULL 0 ,当定义int *p=NULL;时,相当于int *p; p=NULL;或p=0;表示p不指向任何变量,而是指向地址为0的单元,表明p是空指针。也就是说,有效数据的指针不指向0单元。注意:注意:空指针与未对p赋值是两个不同概念。空指针p是对p赋0值,而未对p赋值并不等于p无值,只是它是一个无法预料的值,这就可能影响有用单元。因此在引用指针变量之前,一定要对它赋值。任何指针变量或地址都可以与NULL作相等或不相等的比较。如:p=NULL,如果结果为真(1),表

24、明p为空指针,否则p不是空指针。指向基本数据类型变量的指针变量指向基本数据类型变量的指针变量( (续续3)3)课件制作:刘达明课件制作:刘达明 023-66834110改狭太絮迪沛贼灭再嘿兜寅茂样尼懂绵播硕纵颁蔼挞以域景洼伞娘艺惑刻第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)14 /113 数组是同一类型变量组成的有序集合,其本身存储的是各种类型的数据;而指针是专门用来存放其它变量的地址,当一个指针变量指向某一数组时,在对该数组元素的存取方式上,通过数组的下标与通过数组指针的运算访问数组元素是十分相似的。 一个变量可以有一个地址相对应

25、,而一个数组包含若干个元素。每个数组元素都在内存中占用存储单元,同样有一个地址相对应。指针变量可以指向变量,所以也可以指向数组和数组元素,即把数组起始地址或某一元素的地址放到一个指针变量中。 所谓数组的指针数组的指针是指数组的起始地址,而数组元素的指针数组元素的指针是指数组元素的地址。实际上,定义的数数组名就是一个指名就是一个指针,表示数组的首地址,是一个固定值,一个常量,与定义的指针变量是不同的。对数组的访问,即对数组元素的操作,可使用:下下标法法,即直接使用数组的下标方式,如:a0、a4等;和指指针法法,即通过指向数组元素的指针找到所需的数组元素。 指向数组元素的指针指向数组元素的指针 定

26、义:int a10,*p; 数组元素相当于一个变量,因此每个元素的地址都可以赋给对应类型的指针变量。如:p=&a0;、p=&a2;、p=&a9;等都是合法的。p=&a8; 表示指针变量p指向了数组的第9个元素,而p=&a0;则表示指针变量p指向了数组的第1个元素。这时指针变量p与数组a就建立了关系,我们可以通过指针变量p访问数组a了。 注意:注意:数组的类型与指针变量的类型应一致。2 2、指向一维数组的指针、指向一维数组的指针课件制作:刘达明课件制作:刘达明 023-66834110计悍兴多茸鞘歌固蓟避健里钵尿旧慨荚暇污淌锑虐膊翔乔骸需稻灼风栈疾第4章指针与数组第4章指针与数组第一节第一节 一

27、维数组一维数组(第四章(第四章 指针与数组)指针与数组)15 /113 C语言规定数组名代表数组的首地址,即第0号元素的地址。因此:当定义int a10,*p;时,赋值语句:p=&a0;与p=a;是等价的。这时指针变量p就指向了数组a。注意:注意:数组a不代表整个数组元素,“p=a;”的作用是“把数组a的首地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。但是,这时就把数组a与指针变量p建立起了一种关系,我们可以通过指针变量p访问数组a了。如下定义与赋值:int a10; int *p; p=a;与:int a10; int *p; p=&a0;是等价的。与:int a10; int

28、*p=a; 也是等价的。与:int a10; int *p=&a0; 也是等价的。“int *p=a;”的作用是将数组a的首地址(即a0的地址)赋给指针变量p,而不是赋给*p。指向数组的指针指向数组的指针内存用户数据区内存用户数据区a0=1a1=3a2=2592000200220042008a3=-1a4=-1020060000000100000000111101101111111100000011000000000000001100000001111111111111111120043010pp=&a2;p=&a0;或或p=a;p课件制作:刘达明课件制作:刘达明 023-66834110肥脆

29、左提瀑赞路悟昏胡镀贾捞祭咙纳韭棕搏线讨恋淹溢示卤懊瓣嫡貉让关第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)16 /113有如下定义:int a20,*p;如果p的初值赋值为:p=a;或p=&a0; 则有:p或a均表示数组a的首地址,即&a0。这时的*p=2;或*a=2;都表示对a0元素赋值为2,即相当于:a0=2;。p+i或a+i就是ai的地址,即&ai。因此*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素ai,这时*(p+i)=3;或*(a+i)=3;就相当于ai=3;。因此*(p+i),*(a+i),ai是等价的。注意:

30、注意:在C编译时,对数组ai的处理实际上就是处理成*(a+i)的,即按数组首地址加上相对位移量得到要找的元素的地址,然后找出该单元中的内容。因此*(a+i)的表示法比ai的表示法在程序执行时要快得多。由此可知,下标运算符实际上是变址运算符变址运算符,即将ai按a+i计算地址,然后找出此地址单元中的值。通过指针引用数组元素通过指针引用数组元素a数组存储区数组存储区a0a1a22000200220042000+2*iai3010pp , ap+2,a+2p+i,a+ia192038p+19,a+19p+1,a+1课件制作:刘达明课件制作:刘达明 023-66834110澄猾函邪仲官知往日双美馈酱眯

31、一擦今德风眯慕盖慈校丫豫谁崇不膝始坚第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)17 /113指向数组的指针变量也可以带下标。如:pi与*(p+i)是等价的,也与*(a+i)和ai是等价的。注意:注意:pi是数组元素的值而不是指针。因此*(p+i),*(a+i),ai,pi等价。如果:int a10,*p; p=&a4; 则:p2表示a6元素,p-3表示a1元素。引用数组元素的三种方法引用数组元素的三种方法引用数组元素的方法分为两大类:下标法下标法(如:a2)和指针法指针法(又有两种方式:通过数组名计算数组元素地址,找出元素的值,如:

32、*(a+2);和用指针变量指向数组元素,如:*(p+2)。例例 4.1 有一个整型数组,共有一个整型数组,共10个元素,输出数组中的全部元素。个元素,输出数组中的全部元素。 (详见教材详见教材P107)下标法:#include main() int a10,i; for (i=0;i10;i+) scanf(“%d”,&ai); printf(“n”); for (i=0;i10;i+) printf(“%6d”,ai); 通过数组名计算元素地址:#include main() int a10,i; for (i=0;i10;i+) scanf(“%d”,&ai); printf(“n”);

33、for (i=0;i10;i+) printf(“%6d”,*(a+i); 通过指针变量操作数组元素:#include main() int a10,i,*p; for (i=0;i10;i+) scanf(“%d”,&ai); printf(“n”); for (p=a;p(a+10);p+) printf(“%6d”,*p); 课件制作:刘达明课件制作:刘达明 023-66834110捧邯置万膊炔耽遇刻擞劲食文祸炙训紫叶朵菜皮淄捧去莉食乳加龚劫仇于第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)18 /113在例4.1中,所使用的三种

34、方法的比较如下: 第1和第2种方法执行效率是相同的,都是将ai转换为*(a+i)处理。这两种方法找数组元素费时较多。 第3种方法比第1和第2种方法执行快,用指针变量直接指向元素,不必每次都重新计算地址,像p+这样的自加操作是比较快的,它是有规律地改变地址值的。 用下标法比较直观,能直接知道是第几个元素。如a5表示第5号元素(从0开始)。 用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪个元素。如进行多次p+操作后p值已改变,就要分析当前指针变量p指向哪个元素。但使用指针变量方式在复杂的数据结构中就显示出它的灵活性。使用指针变量对数组操作时应注意的问题使用指针变量对数组操作时应注意

35、的问题 指针变量可以实现使本身的值改变,而数组名是表示一个固定不变的数组首地址。如:int a10,*p=a; 则,执行p+(或p+=1或p=p+1)后,p就指向下一个元素a1。当定义int a10,*p; p=&a6; 执行-p(或p-=1或p=p-1)后,p就指向上一个元素a5。但是:for(p=a;a(p+10);a+) printf(“%d”,*a);则是非法的,不能实现a+且无意义。 定义int a10,*p; p=&a9;,这时再执行p=p+1;操作,p就指向了数组a以后的内存单元了,而不再指向数组a了。如果引用a10,C系统不作为非法,而是转换为*(a+10)处理,但它已超出数组

36、a的范围了,因此不能得到预期的结果。所以,在使用数组a或指针变量p时,应保证数组在有效范围内引用,保证指针变量是指向数组中有效的元素的。课件制作:刘达明课件制作:刘达明 023-66834110侥岗掇梧蓝掷鞍蜀胃莫限鹊缚拽咎垮的动獭隅待夏旋魔老扬届嗅锡李梳贱第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)19 /113特别注意指针变量的当前值。如以下程序: 指针变量的运算 p+(p+(或或p+=1p+=1) ),使p指向下一元素,如果p的初值为数组a的首地址的话,这时p就指向a1元素了。若再执行*p,就取出了a1的值。 *p+*p+,由于

37、+和*同一优先级,结合方向为自右而左,因此它等价于*(p+)。作用是#include main() int a10,i,*p; p=a; for (i=0;i10;i+) scanf(“%d”,p+); printf(“n”); for (i=0;i10;i+,p+) printf(“%6d”,*p);这是错误的程序。第一个循环中的p+运行完后使它不指向数组a了。#include main() int a10,i,*p; p=a; for (i=0;i10;i+) scanf(“%d”,p+); printf(“n”); p=a; for (i=0;ia1,则交换;然 后比较第二个数与第三个数

38、;依次类推,直至第n-1个数和第 n个数比较为止第一趟冒泡排序,结果最大的数被安置在 最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在 第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束 注:在第一趟比较中要进行N1次两两比较,在第J趟比较中要进行NJ次比较。p=a;while(pa+100) printf(“%6d”,*p+);p=a;while(pai+1真假a i ai+1输入n个数给a1到an输出a1到an课件制作:刘达明课件制作:刘达明 023-66834110遗恶踏巨妮矩规堕腮美豫瘤峪贱伶畏肋班报佬捻撞仟父翻辖都天指族倘搁第4章

39、指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)23 /113例例4.2(4.2(续续2)2)#include main() int a11,i,j,t; printf(Input 10 numbers:n); for(i=1;i11;i+) scanf(%d,&ai); printf(n); for(j=1;j=9;j+) for(i=1;iai+1) t=ai; ai=ai+1; ai+1=t; printf(The sorted numbers:n); for(i=1;i11;i+)printf(%d ,ai);#include main

40、() int a11,i,j,t,*p; printf(Input 10 numbers:n); p=a+1; for(i=1;i11;i+) scanf(%d,p+); printf(n); for(j=1;j=9;j+) for(i=1;iai+1) t=ai; ai=ai+1; ai+1=t; printf(The sorted numbers:n); p=a+1; for(i=1;i11;i+,p+)printf(%d ,*p);或课件制作:刘达明课件制作:刘达明 023-66834110椰分掏陀劈些卜奸艇谓滞搏值屉耻溪鹊轿暂陪栏纬蜜弯沾鞭述衅钵刃矽刘第4章指针与数组第4章指针与数组第

41、一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)24 /113例例4.2(4.2(续续3)3)以输入6个整数为例说明其执行过程:第一次循环示意图(共6个数,循环5次):985420第一次895420第二次859420第三次854920第四次854290第五次854209结果最大课件制作:刘达明课件制作:刘达明 023-66834110枫蔑燥药脓愉舔衫隆阴黔菱厉琉保痔序伴钓蝎晋簇癌顺粱辩秤鸡弘笼馈残第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)25 /113例例4.2(4.2(续续4)4)54820第三次54280第

42、四次54208结果 第二次循环示意图如下(共5个数,循环4次) :85420第一次58420第二次次大课件制作:刘达明课件制作:刘达明 023-66834110瓷燥疡分风跑榜丝狗梨壮亢汽牧庙汤于秘恶阶程屏纵逼椽伪染啮陛霍今衬第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)26 /113例例4.2(4.2(续续5)5)024589 结果20第一次02结果 第五次循环4520 第二次4250第三次4205结果 第三次循环示意图如下:4520 第一次240第二次204结果240第一次 第四次循环示意图如下:课件制作:刘达明课件制作:刘达明 02

43、3-66834110贝颓咯睹宇视嗓惑元鼓惨妥粗庞翘苟勘魂哲阿峙魂庶骸酒址蠕佳茂柬欺仙第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)27 /113例例4.34.3 求斐波那契Fibonacci数列:1,1,2,3,5,8,的前40项。 解:在第三章中讲过 (详见教材P77的例3.31),这里使用数组实现。#include main() int i,f40=1,1; for(i=2;i40;i+) fi=fi-2+fi-1; for(i=0;i40;i+) if(i%4=0) printf(n); printf(%12d,fi); f0=1

44、,f1=1for i=0 to 39输出:fifor i=2 to 39fi=fi-1+fi-2课件制作:刘达明课件制作:刘达明 023-66834110巧短托占车肋国原家繁摸冗谊缄酱吕瑞付须厚锣肚晦阂贡蘑鳞肇严塞矾煮第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)28 /113例例4.44.4 用选择法对10个数排序。输入n 个数给a1 到 anfor i=1 to n-1for j=i+1 to najak真假k=j输出a1 到 ank=iaiaki != k真假排序过程排序过程: (1)首先通过n-1次比较,从n个数中找出最小的数的

45、下下标标,通过下标找到对应的元素并与第一个数交换第一趟选择排序,结果最小的数被安置在第一个元素位置上。 (2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换第二趟选择排序。 (3)重复上述过程,共经过n-1趟排序后,排序结束。课件制作:刘达明课件制作:刘达明 023-66834110通财外佳嚎填殉敬年暖淌育在烤方示袒蚀球嫌隐维垣污灯寥褥督法卯箕见第4章指针与数组第4章指针与数组29 /113例例4.44.4(过程)(过程)例初始: 49 38 65 97 76 13 27 kji=11349一趟: 13 38 65 97 76 49 27 i=22738二趟:

46、 13 27 65 97 76 49 38 三趟: 13 27 38 97 76 49 65 四趟: 13 27 38 49 76 97 65 五趟: 13 27 38 49 65 97 76 六趟: 13 27 38 49 65 76 97 kkkkjjjjjjjjjj课件制作:刘达明课件制作:刘达明 023-66834110侵淆茨景档镍简米三通扮宵膛镜委货廉赎没论缩清贤校啸澎痰蓬响诲鞍傀第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)30 /113例例4.44.4(程序)(程序)#include main() int a11,i,j,

47、k,x; printf(Input 10 numbers:n); for(i=1;i11;i+) scanf(%d,&ai); printf(n); for(i=1;i10;i+) k=i; for(j=i+1;j=10;j+) if(ajak) k=j; if(i!=k) x=ai; ai=ak; ak=x; printf(The sorted numbers:n); for(i=1;i11;i+)printf(%d ,ai);课件制作:刘达明课件制作:刘达明 023-66834110二堤猜渡搔激齿审铺伙盛达阳清胆缅韩墓呐姬芥谭竟贺爪插栈凯蛹劝仙徽第4章指针与数组第4章指针与数组第一节第一节

48、 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)31 /113例例4.54.5 用折半法查找一个数。 有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半法找出该数在数组中第几个元素的值位置。如果该数不在数组中,则打印出“无此数”。 对于无序的一组数据,只能使用顺序查找法顺序查找法查询数据。折半查找折半查找(也称对分查找)的前提是已经排好序。 折半查找法的思想折半查找法的思想:使用均分确定的方法,先测区间的中点元素;如果被查找信息的关键字小于中点元素,则关键字在测中点的前半部分(降序时为后半部分);如果被查找信息的关键字大于中点元素,则关键字在测中点的后半部分(降序时

49、为前半部分)。继续该过程直到找到该关键字或无法二分为止。课件制作:刘达明课件制作:刘达明 023-66834110召冒封蠢墨楷乏贩评冷任范蕊总版纫呢媳综勋沾毁讶涉趣多梧渴栏坡躺奸第4章指针与数组第4章指针与数组第一节第一节 一维数组一维数组(第四章(第四章 指针与数组)指针与数组)32 /113例例4.54.5 程序。#include #define N 15main() int bins(int a,int n,int x); int aN,i=1,x; scanf(“%d”,&a0); while(i=ai-1) i+; scanf(“%d”,&x); pos=bins(a,N,x); i

50、f(pos!=-1) printf(“%d,%d”,pos,x); else printf(“Not found”);/* 升序的折半法查找 */int bins(int a,int n,intx) int low,high,mid; low=0; high=n-1; while(lowamid) low=mid+1; else if(x1课件制作:刘达明课件制作:刘达明 023-66834110击皂纺第稗荆截膏茹各绽醉谭谗抽舔庸诡谅西炼拦啪守晶札泌消豫锄嫉欧第4章指针与数组第4章指针与数组二维数组可看成若干元素的一维数组二维数组可看成若干元素的一维数组第二节第二节 二维数组二维数组(第四章(

51、第四章 指针与数组)指针与数组)39 /113 在C语言中,二维数组采用类似于float a34;的定义,使我们可以把二维数组看成是一种特殊的一维数组:它的元素又是一个一维数组。 如:float a34;把a看成是一维数组,它有3个元素:a0、a1、a2,每个元素又包括4个元素的一维数组。而a0、a1、a2就看成是包含4个元素的一维数组的数组名。 即定义:float a34;相当于定义:float a04,a14,a24;。a0 = a00 a01 a02 a03 a1 = a10 a11 a12 a13 a2 = a20 a21 a22 a23 a34 a00 a01 a02 a03 a10

52、 a11 a12 a13 a20 a21 a22 a23 课件制作:刘达明课件制作:刘达明 023-66834110前暑馈救耙迪蕾傍壁习秩贿族酚拨靴呀牟鸯棉撒妈宵稍霉桩鸥颈隐衍酗均第4章指针与数组第4章指针与数组5 5、二维数组的初始化、二维数组的初始化第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)40 /113 二维数组与一维数组一样,可以对二维数组的元素进行赋值或者初始化。数组在定义后,它所占有的存储单元中的值是不确定的,引用数组元素之前,必须保证数组的元素已经被赋以确定的值。二维数组初始化的方法如下: 分行分行给二二维数数组赋初初值。 int a23=1,2,3

53、,5,6,7; 第一个内花括号的值赋给数组的第一行,第二个内花括号的值赋给数组的第二行。 所有数据写在一个花括弧内所有数据写在一个花括弧内,按顺序赋初值,按顺序赋初值。 int a23=2,3,5,6,7,8;它将第一组3个数赋给数组的第一行,第二组3个数赋给数组的第二行。该方法相对简单,但是,当数组元素较多时,容易出现混乱、遗漏、出错。在行、列数较多时,使用第一种方法较好。 对于定义的静态存储(关键字为static)数组,如果没有赋初值,则系统自动将全部元素赋以0值或0值。 如:static int a22;相当于static int a22=0,0,0,0 而对定义的int a22;如果不

54、对其赋初值,则数组中各元素的值是不确定的。课件制作:刘达明课件制作:刘达明 023-66834110中旦九狗战娩枣既铺啤忆考煤云侯堑吮讥坟裹堰辈处辈袜狂室慷达醛蔑肢第4章指针与数组第4章指针与数组对部分元素部分元素赋初初值第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)41 /113 数组在对部分元素赋初值时,如果后面的数组元素不赋初值,系统会对所有数组元素自动赋以0值。 如:int a23=0,2,1;相当于:int a23=0,2,0,1,0,0;。 再如:static int d23=8,5,9;相当于:static int d23=8,5,0,9,0,0;。 又

55、如:int b23=1,0,3;相当于: int b23=1,0,3,0,0,0;。 如果对全部元素都赋初值时,则定义数组时,第一维(行)的长度可以不指定,但第二维(列)的长度不能省需要指定。 如:int a4=1,2,3,4,5,6,7,8,9,10,11,12等价于:int a34=1,2,3,4,5,6,7,8,9,10,11,12;。课件制作:刘达明课件制作:刘达明 023-66834110酞诗诧捶串僻钟印递搽赤呢樟硷烛殃判册佳螺舵迸私缚达帽巫遥迁跺暮还第4章指针与数组第4章指针与数组键盘输入赋值键盘输入赋值第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)42

56、/113 通过键盘输入二维数组的数组元素,一般需要使用二重循环的形式进行。可以先行输入,也可先列输入。 先行先行输入方式入方式 int a34; for(i=0;i2;i+) for(j=0;j3;j+) scanf(“%d”,&aij); 先列先列输入方式入方式 int a34; for(j=0;i3;j+) for(i=0;i2;i+) scanf(“%d”,&aij);说明明:不管是先行输入,还是先列输入,在计算机存储中数组元素仍然是按行存储的。课件制作:刘达明课件制作:刘达明 023-66834110毯版凉裹关凡舜度搞守伶瓢惜粤篆摸锁埋苯挝寥颧静器什谊放庶舔章紧砖第4章指针与数组第4章

57、指针与数组通通过赋值语句句赋初值赋初值第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)43 /113 如:int a22; a00=1; a01=2; a10=3; a11=4;。 在定义数组时也可以只对部分元素赋值,而省略第一维的长度,但应使用分行赋值方式。 如: int a4=1,3,1,0,0,9; 它与 int a34=1,3,1,0,0,9; 等价。注:注:错误的初始化定义: int a33; a=1,2,3,4,5,6,7,8,9; 这是错误的。 而int a33; a33=1,2,3,4,5,6,7,8,9; 也是错误的赋值方式。课件制作:刘达明课件制作:

58、刘达明 023-66834110奸盘贸僳度闪涩榆谍同巨胞桑炊芥掉麻橱捂氧刁奥昭刻酚且虐愚沃兴赐荷第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)44 /113 C语言允许多维数组。多维数组的定义形式为: 类型说明符类型说明符 数组名数组名常量表达式常量表达式1 常量表达式常量表达式2常量表达式常量表达式n; 例如:定义三维数组的方法为:int a234; 定义四维数组的方法为:float f23410;等。 多维数组元素在内存中的存放顺序仍然是“按行优先”,其排列顺序为:第一维的下标变化最慢,最右边的下标变化最快。 如:int a234;

59、定义的是一个三维数组,共有2*3*4=24个元素。其中第一维下标变化最慢,第二维下标变化次之,第三维下标变化最快。在内存的存放顺序为: a000, a001, a002, a003, a010, a011, a012, a013, a020, a021, a022, a023, a100, a101, a102, a103, a110, a111, a112, a113, a120, a121, a122, a123。二、二、多多维数组的概念维数组的概念课件制作:刘达明课件制作:刘达明 023-66834110幢面途亏直担次汹摹穗恒芯盒当酒嫡裂直隧仿喧瑶罐叶怖芽赋哑静枚洞圃第4章指针与数组第4

60、章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)45 /113 分行初始化分行初始化: int a234=1,2,3,4,5,6,7,8,0,0,0,0, 13,14,15,16,17,18,19,20,21,22,23,24。 顺序赋值初始化顺序赋值初始化: int a234=1,2,3,4,5,6,7,8,0,0,0,0,13,14,15,16,17,18,19,20, 21,22,23,24;。 也可省略第一维的长度初始化也可省略第一维的长度初始化: int 34=1,2,3,4,5,6,7,8,0,0,0,0,13,14,15,16,17,18,19

61、,20, 21,22,23,24;。 可将它看成2个二维数组a034和a134。也可看成是6个特殊的一维数组: a004、a014、a024、 a104、a114、a124 。多多维数组的初始化维数组的初始化课件制作:刘达明课件制作:刘达明 023-66834110瘩屹袒险赏透坏角施匆挺堂类乃到幼撬欣狈池扛涩轿甚数剿圾楼迪罚慰览第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)46 /113 1 1、二维数组的地址、二维数组的地址 关于一维数组与指针关系的结论可以推广到二维数组、三维数组等多维数组。可以把二维数组看成是这样的一维数组:它的每

62、个单元本身又是一个一维数组。 例如:int a43=1,3,5,7,9,11,13,15,17,19,21,23; 这里a是一个数组名。数组a包含4个元素(即4行):a0,a1,a2,a3,而每个元素又是一个包含3个元素(即3列元素)的一维数组。如a1代表的一维数组包括:a10,a11,a12三个元素。三、三、指向二维数组的指针变量指向二维数组的指针变量= a00 a01 a02 = a10 a11 a12 = a20 a21 a22 = a30 a31 a32 a0a1a2aa3= 1 3 5 = 7 9 11 = 13 15 17 = 19 21 23 a0a1a2aa3a0a1a2aa3

63、1000100610121018a00 a01 a02a10 a11 a12a20 a21 a22a30 a31 a32a+1a+2a+3课件制作:刘达明课件制作:刘达明 023-66834110必琴能糟锌准宇弛慎矗祈径酥行见焚炕洲补倘垃捏敢囊大欠秤状姑扎星狂第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)47 /113 从二维数组的角度来看,a a代表代表整个整个二二维数数组的首地址的首地址,也就是二维数组a的第0行的首地址。假设二维数组a的首地址为:1000,那么,a的地址应为1000。则a+1为1006,因为第0行有3个整型数据,因

64、此a+1a+1的含义是a1a1的地址的地址。a+2a+2代表第2行的首地址,它的值是1012,是a2a2的地址的地址。a+3a+3代表第3行的首地址,它的值是1018,是a3a3的地址的地址。 既然把a0、a1、a2、a3看成是4个一维数组名,而C语言又规定了数组名代表数组的首地址。因此a0a0代表了第0行一维数组中第0列元素的地址,即&a00&a00。同样a1a1代表了第1行一维数组中第0列元素的地址,即&a10&a10。a2a2代表了第2行一维数组中第0列元素的地址,即&a20&a20。a3a3的值是&a30&a30。 作为一维数组a0的其他元素的地址可以使用a0+0、a0+1、a0+2分

65、别表示元素a00、a01、a02的地址。一般地,ai+jai+j即表示第i行第j列元素的地址,即&aij&aij。如a1的值是1006,则a1+1表示1008,它是&a11的值。有关二维数组地址的描述:有关二维数组地址的描述:课件制作:刘达明课件制作:刘达明 023-66834110蹬召胰婆搞仁纪卑被浪岿酿绘泪界娶娃晚趋梳疾蹦沼澡界杂谤贸舀棘膀碧第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)48 /113 由于a+1表示a1的地址,因此*(a+1)就是a1的值。a表示a0的地址,因此*a也就是a0的值。 一般地,a+i表示ai的地址,因

66、此*(a+i)就是ai的值。所以*a*a与a0a0是等价的,a1a1与*(a+1)*(a+1) 是等价的。一般地,aiai与*(a+i)*(a+i)是等价的。 而a0又表示a00的地址,a1又表示a10的地址,ai又表示ai0的地址,因此*(a+1)*(a+1)、*a*a、*(a+i)*(a+i)虽然形式上是指针运算符,似乎指的是变量地址中所存储的值,但它仍然是地址仍然是地址,它们分别是a1、a0、ai的值。而a1、a0、ai仍然是地址,它们分别是a10、a00、ai0的地址。 注意:注意:a+i并不是一个变量,它是ai的地址。 a是二维数组名,代表数组首地址,不能用*a来得到a00的值。*a

67、相当于*(a+0)即表示a0,它是第0行地址。a是行指针,*a是列指针。*a表示a00的值。同样*(a+1)是a10的值。有关二维数组地址的描述有关二维数组地址的描述( (续续1)1):课件制作:刘达明课件制作:刘达明 023-66834110昏芋秉移碉淄蔬杯奢表顿炯由洞掌朽戎脖刃赖什裤菲砖培刑浪秽磊字修络第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)49 /113 二维数组元素的值的表示二维数组元素的值的表示 既然a1与*(a+1)是等价的,那么a1+2就可以写成*(a+1)+2,而a1+2是a12的地址。因此*(a1+2)就是a12

68、的值,所以*(*(a+1)+2)也代表a12的值。( (注意值与地址的表示与差别注意值与地址的表示与差别) )。 即a12a12、*(a1+2)*(a1+2)、*(*(a+1)+2)*(*(a+1)+2)三个是等价的,都表示数组元素a12的值。 同样a01a01、*(a0+1)*(a0+1)、*(*a+1)*(*a+1)三个是等价的,都表示数组元素a01的值。 一般地,aijaij、*(ai+j)*(ai+j)、*(*(a+i)+j)*(*(a+i)+j)都表示aijaij的值,甚至还可以写成(*(a+i)j(*(a+i)j的形式。有关二维数组地址的描述有关二维数组地址的描述( (续续2)2)

69、:课件制作:刘达明课件制作:刘达明 023-66834110簇剔痛片蠕挡援澡艳矩学办吩盅仍仕抵毫压爆冯曰谢讳酚涣乃趣酋虏害猫第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)50 /113 ai从形式上看是数组a中的第i个元素。如果a是一维数组名,则ai代表数组a第i个元素所占的内存单元的值,ai是有物理地址的,是占内存单元的。但如果a是二维数组名,则ai代表一维数组名,它本身并不占实际的内存单元,也不存放数组a中各个元素的值,它只是一个地址。 以下是几种表示形式的对比:有关二维数组地址的描述有关二维数组地址的描述( (续续3)3):表示形

70、式表示形式 含义含义 地址值地址值&a 指向二维数组的指针 1000a 二维数组名,指向一维数组a0,即第0行首地址 1000a0 , *(a+0) , *a 第0行第0列元素地址 1000a+1 , &a1 第1行首地址 1006a1 , *(a+1) 第1行第0列元素地址 1006a1+2 , *(a+1)+2 , &a12 第1行第2列元素地址 1010*(a1+2) , *(*(a+1)+2) , a12 第1行第2列元素的值 元素值为11课件制作:刘达明课件制作:刘达明 023-66834110本莹邱漠割尔篙次璃矢抢巩慌微捻馈梯鼠啮泥哆官季妈男舵状夺茬洗承惹第4章指针与数组第4章指针

71、与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)51 /113 二维数组名二维数组名( (如如a)a)是指向行的是指向行的,因此a+1中的1代表一行中全部元素所占的字节数。一维数组名一维数组名( (如如a0,a1)a0,a1)是指向列元素的是指向列元素的,a0+1中的1代表一个元素所占的字节数。在行指针面前加一个在行指针面前加一个* *就转换为列指针就转换为列指针,如a和a+1是行指针,而*a和*(a+1)就成了列指针,分别指向数组a的第0行第0列的元素和第1有关二维数组地址的描述有关二维数组地址的描述( (续续4)4):1000 1002 1004 1 3 51

72、006 1008 1010 7 9 111012 1014 1016 13 15 171018 1020 1022 19 21 23aa+1a+2a+3a0a0+1a0+2行第0列的元素。反之,在列指在列指针前面加针前面加& &就成为行指针就成为行指针,如a0是指向第0行第0列的元素的列指针,而&a0它就指向二维数组的第0行(由于a0与*(a+0)等价,因此&a0与&*a等价)。课件制作:刘达明课件制作:刘达明 023-66834110贬绷艺灾煞昆典尊悍建箍蔗辗矽橡椰火宫锅眼儒袒弊域幼浴倘唁吐儡淆想第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针

73、与数组)52 /113 不要把&ai简单的理解为ai的物理地址,因为并不存在ai这个变量。它只是一种地址的计算方法,能得到第i行的地址,&ai和ai的值是一样的,但它的含义却不同。 &ai&ai或或a+ia+i指向行指向行,而aiai或或*(a+i)*(a+i)指向列指向列。当下标j=0时,&ai和ai+j的值相等。*(a+i)只是ai的另一种表示形式。在二维数组中,a+i=ai=*(a+i)=&ai=&ai0即它们的地址值是相等的。2 2、指向数组元素的指针变量、指向数组元素的指针变量 对于二维数组元素的操作,可像一维数组用指针变量对它的操作一样。但在操作中要注意数组元素的行和列的问题。二维

74、数组元素在存储中,是按行存储的。如果一个指针变量指向某个存储单元,指针的移动,也是顺序的指向相应存储单元。有关二维数组地址的描述有关二维数组地址的描述( (续续5)5):课件制作:刘达明课件制作:刘达明 023-66834110喇棺侄仔掐厨侈妖铡蘑舌毙谬戌唇禽憋钒搀虾能洱炊乔造酣百午存除婪篮第4章指针与数组第4章指针与数组例例4.64.6 用指针变量输出数组元素的值。第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)53 /113(详见教材P114的例4.6。) 从例子中可以看出,p是一个指向整型变量的指针变量,它可以指向一般的整型变量,也可以指向整型的数组元素。每次使p

75、加1,以移向下一元素。 如果定义int a43,*p;p=a0;,则aij的值用指针变量p来表示为:*(p+i*3+j),如求a12应为*(p+5)。这里i*n+j(当数组有n列时),就是aij的序号的序号,可用*(p+i*n+j)来表示aij的值。例例4.74.7 用指针变量输出数组元素的值。main() int a34=1,3,5,7,9,11,13,17,19,21,23; int *p; for (p=a0;pa0+12;p+) if (p-a0)%4=0) printf(“n”); printf(“%4d”,*p); 运行结果为: 1 3 5 7 9 11 13 1517 19 21

76、 23a00 1 0a01 3 1a02 5 2a03 7 3pa23 23 11p+1p+11课件制作:刘达明课件制作:刘达明 023-66834110净谓皿柿楞卵绒擅锦贝振荔把矿某衍主澡凶浚罩取志穿胎货罩已芋畸瞄汛第4章指针与数组第4章指针与数组3 3、指向由、指向由m m个元素构成的一维数组的指针变量个元素构成的一维数组的指针变量第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)54 /113 在上例中的指针变量p是指向整型变量的,p+1所指向的元素是p所指向的元素的下一元素,如p=a0;(指向列指向列),这时p指向的元素是a00,而p+1指向的元素是a01。 可以

77、改用另一方法,使p不是指向整型变量,而是指向一个包含m个元素的一维数组。即当p=a0;(指向行指向行)时,要使p+1不指向a01,而是指向a1,p的增值以一维数组的长度为单位(如图)。 为了方便起见,我们可以定义一个具有数组名相同特征的指针,定义形式为: 数据类型数据类型 (* (*指针变量名指针变量名)N;)N; 其中N表示一个整型常量。 注意“()()”不能少。1000 1002 1004 1 3 51006 1008 1010 7 9 111012 1014 1016 13 15 171018 1020 1022 19 21 23pp+1p+2p+3a0a1a2a3课件制作:刘达明课件制

78、作:刘达明 023-66834110宇漆汪砰模幻号遭兰锻曾伺财御蝗寞推船紊巾囊亏幌何重拼攘机当攘百茅第4章指针与数组第4章指针与数组指向由指向由m m个元素构成的一维数组的指针变量的定义个元素构成的一维数组的指针变量的定义第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)55 /113 如:int (*p)4; /* 表示指向具有4个整型元素的数组,p+1就会增加4*2=8 */ float (*pt)3; /* 表示指向具有3个浮点型元素的数组,p+1就会增加3*4=12 */ 再如:int a43, (*p)3; 可使用 p=a; 将指针变量p与数组a建立联系。这时指

79、针变量p指向了二维数组a或指向包含3个元素的一维数组,这时p指向第一个一维数组a0,即p=&a0。而p+1则指向了a1(一次移动3列元素),p+2则指向了a2。又由于a0,a1,a2分别表示二维数组各行的首地址,因此二维数组的列数与指针定二维数组的列数与指针定义的长度义的长度N应相同应相同。这样指针的移动刚好是二维数组行地址的移动;如果不相同,其指针的移动,仍按N个元素进行,但在二维数组中,就不一定是每一行的首地址。 例子见教材P115的例4.7。课件制作:刘达明课件制作:刘达明 023-66834110浪庸锣驭阜蘑盲扛科芽毙墒成怖响一辊沁嚼辗拥议寸恭金洽咯辊兴筏茸喝第4章指针与数组第4章指针

80、与数组例例4.84.8 输出二维数组任一行任一列元素的值。第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)56 /113main() int a34=1,3,5,7,9,11,13,15,17,19,21,23; int (*p)4,i,j; p=a; scanf(“i=%d,j=%d”,&i,&j); printf(“a%d,%d=%dn”,i,j,*(*(p+i)+j);运行结果为:i=1,j=2a1,2=13说明:说明: int (*p)4表示*p有4个元素的一维数组,p的值就是该一维数组的首地址,p是行指针是行指针,它不能指向一维数组中的第j个元素。程序中的p+

81、i是二维数组a的第i行的地址。而*(*(p+i)+j)就是aij的值,*(p+i)+j是指向列的指针,它是元素aij 的地址。注意:注意:p+2与*(p+2)的值虽然相同,但(p+2)+3与*(p+2)+3的值就不相同了。 1 3 5 7 9 11 13 1517 19 21 23pp+1p+2a0a1a2(*p)0(*p)1(*p)2(*p)3p*p (数组数组)课件制作:刘达明课件制作:刘达明 023-66834110矛绅弘贮章峙脐持蹬邹揖排窗自玄絮被辣仪赴勺汗况缆偿港汝覆品酮心耳第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)57

82、/113例例4.94.9 编写程序,实现3行3列矩阵的行列互换。 (详见教材P117的例4.9。)四、四、二维数组程序举例二维数组程序举例#include main() int i,j,t; int array33=1,2,3,4,5,6,7,8,9; for(i=0;i3;i+) for(j=0;j3;j+) printf(“%7d”,arrayij); printf(“n”); for(i=0;i3;i+) for(j=0;j3;j+) t=arrayij; arrayij=arrayji; arrayji=t; printf(“Converted array:n”); for(i=0;i

83、3;i+) for(j=0;j3;j+) printf(“%7d”,arrayij); printf(“n”); 课件制作:刘达明课件制作:刘达明 023-66834110脓胶决虽俄布布俺诬瞄伪还卜溶诗竟澜叹骗装较码网祷乖桨悠访熄脯姬拨第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)58 /113有一个3*4的矩阵,编程求出最大的那个元素的值,以及所在的行号与列号。例例4.104.10main() int i,j,row=0,colum=0,max; int a34=1,2,3,4,9,8,7,6, -10,10,-5,2; max=a0

84、0; for (i=0;i=2;i+) for (j=0;jmax) max=aij; row=i; colum=j; printf(“max=%d,row=%d,colum=%dn”,max,row,colum);max=a00for j=0 to 3aijmaxmax=aijrow=icolum=j真真假假输出:输出:max和和row,columfor i=0 to 2运行结果为:Max=10,row=2,colum=1课件制作:刘达明课件制作:刘达明 023-66834110慷腺洛驭纶另审嚼俘佐葛赢梳阴吊冉账矿洲融找齐噬壶答逸抢赣捷臻印哉第4章指针与数组第4章指针与数组第二节第二节 二维

85、数组二维数组(第四章(第四章 指针与数组)指针与数组)59 /113例例4.11 4.11 打印杨辉三角形。打印杨辉三角形。#define N 11main() int i,j,aNN; for (i=1;iN;i+) aii=1; ai1=1; for(i=3;iN;i+) for(j=2;j=i-1;j+) aij=ai-1j-1+ai-1j; for(i=1;iN;i+) for(j=1;j=i;j+) printf(“%6d”,aij); printf(“n”); printf(“n”);运行结果为:1 1 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6

86、15 20 15 6 11 7 21 35 35 21 7 11 8 28 56 70 56 28 8 11 9 36 84 126 126 84 36 9 1 规律规律:各行第一个数都是1;各行最后一个数都是1;从第3行起,其余各数是上一行同列和前一列两个数之和。课件制作:刘达明课件制作:刘达明 023-66834110篆页锰居灸纵哗梅流辖秉腾柜啪田网叁涎痞赁驴坏揭垢垛晋岗模凉周咋幸第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)60 /113例例4.124.12#include main() int i,j,n=1,a55; for

87、(i=0;i5;i+) for(j=0;j5;j+) aij=n+; printf(“The result is : n”); for(i=0;i5;i+) for(j=0;j=i;j+) printf(“%4d”,aij); printf(“n”); 用循环编程实现按行顺序为一个5X5的二维数组a赋1到25的自然数,然后输出该数组的左下半三角。课件制作:刘达明课件制作:刘达明 023-66834110搔布见嗣铆唁讼轰然叮瞄獭瞄辰挫颓溺坪满粘褒猫想靳椎陛噪斌溅杏幽亨第4章指针与数组第4章指针与数组第二节第二节 二维数组二维数组(第四章(第四章 指针与数组)指针与数组)61 /113例例4.13

88、4.13 了解指针p和t的区别。#include main() int a34=1,2,3,4,5,6,7,8, 9,10,11,12; int i,*p,(*t)4; p=a0; /*指向数组的首地址 (p指向列指向列)*/ t=a; /*指向数组的首地址(t指向行指向行) */ printf(“1. p=%lu,*p=%dn”,p,*p); printf(“ t=%lu,*t=%dn”,t,*t); p=p+1; t=t+1; printf(“2. p=%lu,*p=%dn”,p,*p); printf(“ t=%lu,*t=%dn3.-n”,t,*t); p=p-1; t=t-1; fo

89、r (;pa0+12;p+) printf(“%6d”,*p); printf(“n4.-n”); for (;t=a+3;t+) for (i=0;i1字符串字符串2 2,即:第一个字符串大于第二个字符串,函数返回正整数正整数。 如果:字符串字符串11字符串字符串2 2,即:第一个字符串小于第二个字符串,函数返回负整数整数。 其中其中,字符串1和字符串2可以是字符串、字符数组名或字符指针。 例如:char str1=“ab”,*str2=“Ab”; int n; n=strcmp(str1,str2); /* 结果:n=32 */课件制作:刘达明课件制作:刘达明 023-66834110遂淤

90、拯武胯植坛赣费共膨调矩仔啡境娄室泉酪哪掏踌痹皑役铃搭庶孤椎狞第4章指针与数组第4章指针与数组第三节第三节 字符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数组)77 /1136 6、字符串字符串长度测量长度测量函数函数 格式:strlen(strlen(字符字符串串);); 其作用是其作用是:该函数是用来测量字符串长度的,参数字符串可以是字符串常量、字符数组名或字符指针,它向调用函数返回字符串中0之前的字符串的有效长度。即测试字符串长度不包括0。 返回值:除返回值:除00以外的字符个数以外的字符个数。 如:strlen(“1234”);返回4。char a10=“123”;

91、 strlen(a); 返回3。 char *str=“12345”; strlen(str);返回5。 注意注意:sizeof(“1234”);返回5。sizeof要加字符结束符。课件制作:刘达明课件制作:刘达明 023-66834110撮耀铬脯灶赞谬帧勇敖凰戳乳胺骄瑞尺例懒忆青弧臭俺惧埂餐惯室氖欲县第4章指针与数组第4章指针与数组第三节第三节 字符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数组)78 /1137 7、大小写字母转换、大小写字母转换函数函数 大写转小写格式:strlwr(strlwr(字符字符串串); ); 其作用作用是:将字符串中的大写字母转换成小写字

92、母。 小写转大写格式:strupr(strupr(字符串字符串);); 其作用作用是:将字符串中的小写字母转换成大写字母。 其中其中:字符串是字符串常量、字符数组名或字符指针。返回转换后的字返回转换后的字符串指针符串指针。例如:char str1=“aBcD-123”,*str2=“AbCd,789”; strlwr(str1); /* 结果为:abcd-123 */ strlwr(str2); /* 结果为:abcd,789 */ strupr(str1); /* 结果为:ABCD-123 */ strupr(str2); /* 结果为:ABCD,789 */课件制作:刘达明课件制作:刘达明

93、 023-66834110筷娃尼炸斥睡哆颜湃奴奇五震臆姚殴义辰撑本惦佩丙盛颠兄糖擂剥锑丫袱第4章指针与数组第4章指针与数组第三节第三节 字符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数组)79 /1138 8、找字符或字符串位置函数、找字符或字符串位置函数 查找字符格式:strchr(strchr(字符串字符串, ,字符字符);); 作用:返回“字符”在“字符串”中起始位置的指针。 查找字符格式: strstr(str1,str2);strstr(str1,str2); 作用:返回字符串str2在字符串str1中起始位置的指针。 如:strchr(“abcdefg”,c)

94、; /* 结果为:cdefg */ strstr(“abcdefg”,”de”); /* 结果为:defg */ 注意注意:以上介绍的几种常用的字符串处理函数,应该强调的是:库函数并非C语言本身的组成部分,而是人们为使用方便而编写、提供给大家使用的公共函数。每个系统提供的函数数量和函数名、函数功能、参数等都可能不尽相同,使用时要小心,应查系统提供的库函数手册。在教材附录三中列举了部分C常用库函数表(详见教材P299-304)。课件制作:刘达明课件制作:刘达明 023-66834110甫祁泣窃没唾丢轰晤迂驰腺羚俭讶掩逾孝汲赡滇年污弥宏甩吵呢畸款输台第4章指针与数组第4章指针与数组第三节第三节 字

95、符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数组)80 /113四、四、字符数组与字符串程序举例字符数组与字符串程序举例例4.14 在一行上输入多个单词(每个单词相当于一个字符串),单词之间用空格符分开,统计其中有多少个单词。 (详见教材P122的例4.12。)输入一个字串给输入一个字串给strnum=0,w=0,i=0当当(c=stri!=0)c=一个空格一个空格w=0w=1num+i+w=0真真真真假假假假输出:输出:num解:说明说明,w作为判别是否单词的标志,若w=0表示 未出现单词,如出现单词则将w置成1。num为 单词个数。i为循环变量。 解题思路解题思路为:

96、单词数目可以由空格出现的次数 决定(连续的若干个空格作为出现一次空格,一 行开头的空格不统计在内)。如果出现某一字符 为非空格,而它的前面的字符是空格,则表示 “新的单词开始了”,此时使num累加1。如果当 前字符为非空格而其前面的字符也是非空格, 则意味着仍然是原来那个单词的继续,num不应 累加。若w=0表示前面一个字符是空格,若w=1 则表示前面一个字符不是空格。 注意注意:程序中for语句中的(c=stri)!=0是循环 条件,其作用是先将字符数组元素stri赋给c, 然后判断c!=0。课件制作:刘达明课件制作:刘达明 023-66834110度际且茂看骤袱她佛么果剖蝗哗肆妙窍栖实邻忿

97、沸吝咙煎摸小铣荫蛋蛊楼第4章指针与数组第4章指针与数组第三节第三节 字符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数组)81 /113例4.14 说明图1当前字符=空格是否未出现新单词,使word=0,num不累加前一字符为空格(word=0),新单词出现,word=1,num加1前一字符为非空格(word=1),未出现新单词,num不变课件制作:刘达明课件制作:刘达明 023-66834110莲掏桓恐沸缕础翼规圈完裴返吐许倘稚捷裕虎揩抑酮没醋器侈竭皮花膜文第4章指针与数组第4章指针与数组第三节第三节 字符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数

98、组)82 /113例4.14 说明图2否0是11是1未01否0是12否1未12是1未02否0是13是1未03否0是14否1未14否1未14否1未14例 输入:I am a boy. 当前字符是否空格word原值新单词开始否word新值num值Iamaboy.课件制作:刘达明课件制作:刘达明 023-66834110悉拎实缘沦授渣炸退苟闺季尺搀统昧鞠吴隧弱寺孪揍唾吵涧弦怠太恰担煤第4章指针与数组第4章指针与数组第三节第三节 字符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数组)83 /113例4.14 程序#include main() char string81; int

99、i,num=0,word=0; char c; gets(string); for(i=0;(c=stringi)!=0;i+) if(c= ) word=0; else if(word=0) word=1; num+; printf(There are %d words in the linen,num);注意:printf函数后面的为续行标志。课件制作:刘达明课件制作:刘达明 023-66834110纯喝父厉崖启筋铰蕴嫌疑骑鹃子冠洼也窟驴里先故指术系翅郭类紊采猴说第4章指针与数组第4章指针与数组第三节第三节 字符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数组)84 /

100、113例例4.15 在键盘上输入在键盘上输入n个字符串,求出最大者。个字符串,求出最大者。 (详见教材(详见教材P126的例的例4.14。)。)解:说明说明,n个字符串需用一个n*m的二维数组,即n行m列,每行可存放一个字符串,对字符串进行比较。作为最大的字符串存放单元,定义一个一维字符数组。(当然此题也可以定义N个一维数组来处理。) 程序中定义的二维数组strNM,但在引用时使用的是str0,str1,strN-1,即将二维数组strNM看成了N-1个一维数组,而每个一维数组元素又是一个含有M个元素的一维数组。也就是说,str0是第0个字符串的地址,str1是第1个字符串的地址。课件制作:刘

101、达明课件制作:刘达明 023-66834110撒隘肋迂产蜕帆要穿稀纽厉五鹰蝴弃獭薛寡芦轿然庚罗汽奖册嗽茅库勿姜第4章指针与数组第4章指针与数组第三节第三节 字符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数组)85 /113例例4.15 程序程序#include #include #define N 3#define M 20main() char string20,strNM; int i; for(i=0;iN;i+) gets(stri); strcpy(string,str0); for(i=1;i0) strcpy(string,stri); printf(nTh

102、e largest string is:n%sn,string);当N为3时的运行结果为:chinahollandamericaThe largest string is : holland课件制作:刘达明课件制作:刘达明 023-66834110筷滩浑邑冗衰镰剃焊眉善预蓟飘甸疚兑郧换鹃虫颇拜疵举裂兢慢舆摇瑰吗第4章指针与数组第4章指针与数组第三节第三节 字符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数组)86 /113例例4.16 将字符串将字符串a复制为字符串复制为字符串b。解:本题可以使用两种方法解答。 方法一方法一,定义两个字符数组a和b,通过地址访问数组元素。元

103、素ai可以通过*(a+i)的形式表示。字符串遇到0字符时表示结束。 方法二方法二,定义两个字符数组a和b,再定义两个字符指针*p1,*p2,通过p1=a;p2=b;语句分别使指针p1和p2与数组a和b建立联系,然后通过指针变量p1和p2来访问数组a和b。 注意注意:在方法二中,必须保证p1与p2同步移动。两种方法中数组b的输出可改成类似数组a的输出,即将循环输出改成printf(“string b is: %sn”,b); 。数组b的结尾一定要有0。课件制作:刘达明课件制作:刘达明 023-66834110汲遇咕命鱼铬岩编冻我斤船谗炮缆琶轰岔蔚郸赐蛇颜堵沙绚柱奈抽丫萧埔第4章指针与数组第4章指

104、针与数组第三节第三节 字符数组与字符串字符数组与字符串(第四章(第四章 指针与数组)指针与数组)87 /113例例4.16 程序程序方法一:#include main() char a=“I am a boy.”,b20; int i; for(i=0;*(a+i)!=0;i+) *(b+i)=*(a+i); *(b+i)=0; printf(“string a is:%sn”,a); printf(“string b is:”); for(i=0;bi!=0;i+) printf(“%c”,bi); printf(“n”);方法二:#include main() char a=“I am a

105、 boy.”,b20,*p1,*p2; int i; p1=a; p2=b; for(;*p1!=0;p1+,p2+) *p2=*p1; *p2=0; printf(“string a is:%sn”,a); /*整体输出整体输出*/ printf(“string b is:”); for(i=0;bi!=0;i+) printf(“%c”,bi); /*单个字符输出单个字符输出*/ printf(“n”);课件制作:刘达明课件制作:刘达明 023-66834110坍蜂忙键荔柏夕拜挚销蚁爸搪戊补侩翻霞娩酶姥曲撞漓倚孵妊范第艾谎援第4章指针与数组第4章指针与数组第第4章章 指针与数组指针与数组-

106、习题习题388 /113C语言程序设计语言程序设计 龙昭华主编 习习 题题 (三三)* 复习本章已讲内容,预习本章剩余内容。复习本章已讲内容,预习本章剩余内容。4.5 教材教材P132133的习题的习题4.3写结果中的第写结果中的第小题。小题。4.6 教材教材P133的习题的习题4.4编程题中的第编程题中的第、小题。小题。课件制作:刘达明课件制作:刘达明 023-66834110玉瓷碗楷筑勃蛤眉咸蕊笔费坤衬阜狙歧严嚼浓廊阳锦佩束歇高故寿扳挞凿第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)89 /113一、一、指针数组的定义与使用指针数组

107、的定义与使用 1 1、指针数组的定义、指针数组的定义 如果一个数组的所有元素均为指针类型的数据,则这个数组就称为指针数指针数组组。 一维指针数组的定义形式为: 类型名类型名 * *数组名数组名 常量表达式常量表达式; 如:int *p4; float *t10; char *pc8; 这里定义的int *p4;int *p4;由于比* *优先级高,因此p先与4结合,形成p4p4的形式,这显然是数组形式,它有4个元素p0,p1,p2,p3。然后再与p前面的* *结合,表示此数组是指针类型的,每个数组元素(相当于一个指针变量)都可以指向一个整型变量,这些元素都是一个指针。 注意注意:p为该指针数组

108、名,和其它数组名一样,p是常量,不能对它进行增量运算。p为指针数组元素p0的地址,p+i为pi的地址。则,*p*p就是p0p0,*(p+i)*(p+i)就是pipi。 不要写成int (*p)4;的形式,这是指向一维数组的指针变量。课件制作:刘达明课件制作:刘达明 023-66834110枚擂轰陡延帕驭切整罩参粪赵雕堂拄壬妈翔女靳钵逐缉毖防抢场叉体平盘第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)90 /113为什么要定义和使用指针数组?为什么要定义和使用指针数组? 主要是由于指针数组对处理字符串提供了更大的方便和灵活,使用二维数组对处

109、理长度不等的正文效率低,而指针数组由于其中每个元素都为指针变量,因此通过地址运算来操作正文行是十分方便的。因此,指针数组非常适合用来处理若干个字符串,以及二维数组。 2 2、指针、指针数数组的使用的使用 例如有4个字符串,各字符串的长度不一,即有:“123”,“12”,“12345”,“1”,先对它进行存储和处理,可采用两种方式进行: 定定义一个二一个二维字符数字符数组 char a46=“123”、“12、“12345”、“1”; 来实现。每个字符串在存储中长度是一定的,即每行可存储6个字符(包括0),不满6个字符,后面添为0。在存储该4个字符串中,需要46=24个存储单元。课件制作:刘达明

110、课件制作:刘达明 023-66834110寝臀穷滩领腑廓双功巡粉己咎苔察皮抠镁答么晓蚤殆曲辟男旅畸剿喘催帝第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)91 /113定定义一个字符指一个字符指针数数组 注意注意:指针数组和一般数组一样,允许指针数组在定义时初始化,但由于指针数组的每个元素是指针变量,它只能存放地址,所以对指向字符串的指针数组在说明赋初值时,是把存放字符串的首地址赋给指针数组的对应元素。1 2 01 2 3 01 01 2 3 4 5 0p0p1p2p3pp数组字符串p+1*p与p0等价,*(p+1)与p1等价,*(p+i

111、)与pi等价。 char *p4=“123”,“12”,“12345”,“1”; 其中,每个字符指针的数组元素p0、p1、P2、p3分别表示各字符串的首地址,指向各字符串。在存储该4个字符串中(除字符指针变量外)需要4+3+6+2=15个存储单元。课件制作:刘达明课件制作:刘达明 023-66834110讹全麓赠层礼杆恍伪值南览缸妄匡坏元摸栅陨乎追霓很每刨岳班粱芋螟频第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)92 /113二、二、指向指针的指针指向指针的指针 如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针

112、数据的指针变量指向指针数据的指针变量,又称多级指针多级指针,简称为指向指针的指针指向指针的指针。 指向指针数据的指针变量的定义形式: 类型型标识符符 * *指指针变量名量名; ; 如:int m=3,n=4,*pm=&m,*pn,*pp; pn=&n; pp=&pn;&pn&n4n的值pnpp&m3m的值pm课件制作:刘达明课件制作:刘达明 023-66834110共晚扰酌欺砍淘肚诣八姬疲家洲搪钞壹砒搁睫痊振专红讳好舌及茹茅懒实第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)93 /113指向指针的指针的例子指向指针的指针的例子 如:in

113、t a=6,*p,*pp; p=&a; pp=&p; 则:pp指向了p,*pp的值为a的地址值, *pp的值等于*p,即变量a的值。由结合关系可知:*pp相当于*(*pp),而*pp即是p,因此*pp就是*p,也就是变量a的值。&p&a6a的值pppa,*p,*p&a,p,*pp&p,pp课件制作:刘达明课件制作:刘达明 023-66834110脸斋旨其河仲寞姓缉磨秽贾差妻担掷借芯摊瞬晤侥咳痘吕婆裂甄幽杯枉歉第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)94 /113说明:说明: 利用指针变量访问另一个变量就是“间接访问”。如果在一个指

114、针变量中存放一个目标变量的地址,就是“单级间址单级间址”,如m与pm的关系。指向指针的指针用的是“二级间址二级间址”方法如n,pn,pp的关系。 从理论上说,间址方法可以延伸到更多的级成为“多级间址多级间址”。但实际上在程序中很少有超过二级间址的。级数越多,越难理解,容易产生混乱,出错机会也多。&pn&n4n的值pnpp&m3m的值pm地址地址指针变量值值变量地址地址2指针变量2值值变量地址地址1指针变量1地址地址n指针变量n值值变量地址地址2指针变量2地址地址1指针变量1课件制作:刘达明课件制作:刘达明 023-66834110鸥既岸釜烂也典卜罕尽充贸置枷桓构落煎物夕陌蘸协宾矢蟹综错维凛糟斜

115、第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)95 /113例例4.17 用多级指针实现字符串操作。 (详见教材(详见教材P129的例的例4.17。)。) 程序中的p=a+i;因此*p就相当于*(a+i)。而a+0指向的是a0元素,因此*(a+0)就是a0的值,但a0又是一个地址,所以*(a+0)实际上就是字符串“abcde”的首地址。同样*(a+i)就是ai的值,它就是第i个字符串的首地址。 当p=a+2;时,p就指向了a2,当执行p+后, p就指向了a3,它是字符串“ab”的首地址。这时执行printf(“*p=%sn”,*p);的

116、结果就会输出“ab”字符串。abc 0abcde 0ab 0abcd 0a0a1a2a3aa数组字符串a+1abcdef 0a4 程序中定义的char *a=“abcde”,”abc”,“abcd”,”ab”,”abcdef”;相当于:char *a5=“abcde”,”abc”,”abcd”,”ab”,”abcdef”; 程序中的p为二级指针,*p为指向字符串的地址。其p指针仍然可以进行运算。课件制作:刘达明课件制作:刘达明 023-66834110地腿靠蒙拷螟隙筐角眩窿浑切踪刊淀介刀口睦闻亦冻币唾佳异铜践氧今倍第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章

117、指针与数组)指针与数组)96 /113例例4.17程序程序#include #include main()main() static char *a=“abcde”, static char *a=“abcde”, “abc”,“abcd”,“ab”,“abcdef”; “abc”,“abcd”,“ab”,“abcdef”; char *p; char *p; int i; int i; for(i=0;i5;i+) for(i=0;i5;i+) p=a+i; p=a+i; printf(“%sn”,*p); printf(“%sn”,*p); p=a+2; p=a+2; p+; p+; pr

118、intf(“*p=%sn”,*p); printf(“*p=%sn”,*p); 由于定义的char *a5; 它的5个元素a0,a1, a2, a3, a4是地址,而数组名a也是地址,它指向该数组的首地址。因此a就相当于一个二级指针,与定义的p具有相同的特性,但其本质是不同的。abcdeabcabcdababcdef*p=ab运行结果:课件制作:刘达明课件制作:刘达明 023-66834110芹虹叫爷揽惶进忿屎缝抡皂学揽丛嘛供祥登蛀们转刮利放绿完希烫怨秤瘪第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)97 /113例例4.18 多个字符

119、串的排序。 (详见教材(详见教材P128的例的例4.16。)。)该例中定义了char *s;是用s0,s1,si的方式访问字符串的。#include #include main() char *s=“dos”,”windows”, “unix”,”linux”,”Visual basic”; int i,j,k,n; char *t; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) t=si; si=sk; sk=t; /* end for */ for(i=0;in;i+) printf(“%sn”,si);运行结果: Visual bas

120、icdoslinuxunix windows课件制作:刘达明课件制作:刘达明 023-66834110宜父等母级渐庆橇侍靛楚惩艰册免淫揩归喊需佣敌骆瘤又熔拷象炬峙卷乌第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)98 /113例例4.19 利用指向指针的指针变量访问三维字符数组。#include #include main()main() int i; int i; static char c16=“internet”, static char c16=“internet”, ”times”,”mathematics”,”geograp

121、hy”;”times”,”mathematics”,”geography”; char *cp=c0,c1,c2,c3; char *cp=c0,c1,c2,c3; char *cpp; char *cpp; cpp=cp; cpp=cp; for (i=0;i4;i+) for (i=0;i4;i+) printf(“%sn”,*cpp+); printf(“%sn”,*cpp+); printf(“-n”); printf(“-n”); for (i=0;i4;i+) for (i=0;i4;i+) cpp=&cpi; cpp=&cpi; printf(“%sn”,*cpp); print

122、f(“%sn”,*cpp); 运行结果为:internettimesmathematicsgeography-internettimesmathematicsgeography 注意注意:像这里在cp数组中引用c数组的地址,就必须在定义c数组时加static。程序中cpp=cp; 语句是将指针数组cp的首地址传递给指向指针的指针变量cpp,因此表示第i行的首地址应该用*(cpp+i)而不是cpp+i。课件制作:刘达明课件制作:刘达明 023-66834110多恰朝铃酉氦第扰滤与眼沼薄运馅昨杰南趣霖蹲让陪般际留止吭庭吱哈栈第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第

123、四章 指针与数组)指针与数组)99 /113例例4.19(续)(续)也可以使用以下程序实现:也可以使用以下程序实现:#include #include main()main() int i; int i; char *c4=“internet”,”times”, char *c4=“internet”,”times”, ”mathematics”,”geography”; ”mathematics”,”geography”; char *cpp; char *cpp; cpp=c; cpp=c; for (i=0;i4;i+) for (i=0;i4;i+) printf(“%sn”,*cpp

124、+); printf(“%sn”,*cpp+); printf(“-n”); printf(“-n”); for (i=0;i4;i+) for (i=0;i4;i+) cpp=c+i; cpp=c+i; printf(“%sn”,*cpp); printf(“%sn”,*cpp); 运行结果为:internettimesmathematicsgeography-internettimesmathematicsgeography 注意注意:这里定义c数组时可以不加static。程序中cpp=c; 语句是将指针数组c的首地址传递给指向指针的指针变量cpp,因此表示第i行的首地址应该用*(cpp+

125、i)而不是cpp+i。课件制作:刘达明课件制作:刘达明 023-66834110美诵喘仙凹珊爸捉壮盗帆炸果握猜桨衫掖靶瘸漱余痊虐草长屹撑扣涵镜巨第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)100/113例例4.20 多级指针访问整型数据数组。多级指针访问整型数据数组。#include #include main()main() static int a5=1,3,5,7,9; static int a5=1,3,5,7,9; int *num5=&a0,&a1,&a2, &a3, &a4; int *num5=&a0,&a1,&a2,

126、 &a3, &a4; int *p,i; int *p,i; clrscr(); /* clrscr(); /* 清屏清屏 */ */ p=num; p=num; for (i=0;i5;i+) for (i=0;i5;i+) printf(“%dt”,*p); printf(“%dt”,*p); p+; p+; 运行结果为:1 3 5 7 9 注意注意:由于在num数组中引用了a数组的各元素的地址,因此在定义a数组时必须加static。程序中p=num; 语句是将指针数组num的首地址传递给指向指针的指针变量p,因此*(p+i)就表示ai的地址,*(p+i)则是ai的值。课件制作:刘达明课件

127、制作:刘达明 023-66834110滞舌剃枷腮顺够卢镭那唤迹刮信固猩榷坍抿潞截瘤怎东董剃帖巨顿恋著涵第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)101/113例例4.20(续)(续)也可使用以下程序来实现:也可使用以下程序来实现:#include #include main()main() int a5=1,3,5,7,9; int a5=1,3,5,7,9; int *num5; int *num5; int *p,i; int *p,i; clrscr(); /* clrscr(); /* 清屏清屏 */ */ for (i=0

128、;i5;i+) for (i=0;i5;i+) numi=&ai; numi=&ai; p=num; p=num; for (i=0;i5;i+) for (i=0;i5;i+) printf(“%dt”,*p); printf(“%dt”,*p); p+; p+; 运行结果为:1 3 5 7 9 注意注意:由于这里的num数组在定义中没有赋初值,因此在定义a数组时可以不加static。程序中p=num; 语句是将指针数组num的首地址传递给指向指针的指针变量p,因此*(p+i)就表示ai的地址,*(p+i)则是ai的值。课件制作:刘达明课件制作:刘达明 023-66834110垂啤凭稍炊翅遗

129、纯姐公停踢姚罪粮计浇限疆硼冒饰俞详毛庸坍咯碰缎借大第4章指针与数组第4章指针与数组第四节第四节 指针数组指针数组(第四章(第四章 指针与数组)指针与数组)102/113例例4.21 用指针数组访问二维数组中的每一个元素。#include #include main()main() static int a34=1,2,3,4,5,6,7,8,9,10,11,12; static int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i,j,*p3=a0,a1,a2; int i,j,*p3=a0,a1,a2; clrscr(); /* clrscr(); /* 清屏清

130、屏 */ */ for (i=0;i3;i+) for (i=0;i3;i+) for (j=0;j4;j+) for (j=0;j4;j+) printf(“a%d%d=%dt”,i,j,aij); printf(“a%d%d=%dt”,i,j,aij); printf(“n-n”); printf(“n-n”); for (i=0;i3;i+) for (i=0;i3;i+) for (j=0;j4;j+) for (j=0;j4;j+) printf(“a%d%d=%dt”,i,j,(*pi+j)*2); printf(“a%d%d=%dt”,i,j,(*pi+j)*2); 运行结果为:

131、a00=1,a01=2,-a00=2,a01=4, 注意注意:程序中p为指针数组,共有3个指针元素,初始化其值为指向每一行的首地址,即:p0=a0;p1=a1; p2=a2; ,通过(*pi+j)可访问到数组元素aij。课件制作:刘达明课件制作:刘达明 023-66834110蔗菊翘妆赌茸径习撼靠茎瞬遭慈抓腻彪撇椒罚淬晨澎徒谍巩眷捏庄甚阶帆第4章指针与数组第4章指针与数组指针小结指针小结(第四章(第四章 指针与数组)指针与数组)103/113指针小结:指针小结:指针指针p与一维数组与一维数组a的关系的关系:定义int a20,*p; 通过p=a;或p=&a0; 将p和a建立联系:地址描述地址描

132、述 意义意义 数组元素描述数组元素描述 意义意义a,&a0,p a的首地址的首地址 *a,a0,*p,p0 数组元素数组元素a0的值的值a+1,p+1,&a1 a1的地址的地址 *(a+1),*(p+1),a1,*+p 数组元素数组元素a1的值的值a+i,p+i,&ai,&a0+i ai的地址的地址 *(a+i),*(p+i),ai,pi 数组元素数组元素ai的值的值定义定义 含义含义int i; int i; 定义整型变量定义整型变量int *p; pint *p; p为指向整型数据的指针变量为指向整型数据的指针变量int aN; int aN; 定义整型数组定义整型数组a a,它有,它有N

133、 N个元素个元素int *pN; int *pN; 定义指针数组定义指针数组p p,它由,它由N N个指向整型数据的指针元素组成个指向整型数据的指针元素组成int (*p)N; pint (*p)N; p为指向含为指向含N N个元素的一维数组的指针变量个元素的一维数组的指针变量int *p; pint *p; p是一个指针变量,它指向一个指向整型数据的指针变量是一个指针变量,它指向一个指向整型数据的指针变量课件制作:刘达明课件制作:刘达明 023-66834110音抛素眩奥篙彰尸猪弧忻痉亨钒然艘凝螺寒捎冻耽球折难找槐幌沤件窟铃第4章指针与数组第4章指针与数组指针小结指针小结(第四章(第四章 指

134、针与数组)指针与数组)104/113指针小结指针小结( (续续1)1):a数组存储区数组存储区a0a1a22000200220042000+2*iai3010pp , a,&a0p+2,a+2,&a2p+i,a+i,&ai,&a0+ia192038p+19,a+19,&a19p+1,a+1,&a1*p,*a,p0*(p+1),*(a+1),p1*(p+2),*(a+2),p2*(p+i),*(a+i),pi*(p+19),*(a+19),p19地址描述地址描述数组元素描述数组元素描述12593-10一维数组:一维数组:定义: int a20; int *p;通过以下语句建立a与p的联系: p=

135、&a0;或 p=a;课件制作:刘达明课件制作:刘达明 023-66834110梳贷寓翌风亿估善椭施蒋沽他代衍滴纹仅望滔色皆监撼述猴袄垦陵胡增滓第4章指针与数组第4章指针与数组指针小结指针小结(第四章(第四章 指针与数组)指针与数组)105/113指针小结指针小结( (续续2)2):列指针列指针p与二维数组与二维数组a的关系的关系:定义int a34,*p; 通过p=a0;或p=&a00; 将p和a建立联系(注意:这里的指针p是列指针列指针,当p加1时,是指向数组的下一个元素。):地址描述地址描述 意义意义 数组元素描述数组元素描述 意义意义a,*a,a0,&a00,p a的首地址的首地址 *a

136、,*a0,a00,*p,p0 元素元素a00的值的值a,*a,a0,&a00,p a00的地址的地址 *(*(a+1)+2) 元素元素a12的值的值a+1 a10的地址的地址 *(*a+1),*(p+1),p1, 元素元素a01的值的值*a+1,a0+1,p+1, a01的地址的地址 *(a0+1),*(&a00+1),&a00+1 a01a+i ai0的地址的地址 *(*(a+i)+j) 元素元素aij的值的值*a+4i+j,p+4i+j, aij的地址的地址 *(*a+4i+j),*(p+4i+j), 元素元素aij的值的值a0+4i+j, &aij *(a0+4i+j),p4i+j,&a

137、00+4i+j *(&a00+4i+j),aij课件制作:刘达明课件制作:刘达明 023-66834110让佯租赎野练嗅阿眺圾拷蒙邦曼髓擎惦怔哑拂禾诛盈惕喂过去肪忧寻横唱第4章指针与数组第4章指针与数组指针小结指针小结(第四章(第四章 指针与数组)指针与数组)106/113指针小结指针小结( (续续3)3):行指针行指针t与二维数组与二维数组a的关系的关系:定义int a34,(*t)4; 通过t=&a0;或t=a; 将t和a建立联系(注意:这里的指针t是行指针行指针,当t加1时,是指向数组的下一行的第一个元素。):地址描述地址描述 意义意义 数组元素描述数组元素描述 意义意义a,*a,a0,

138、&a00,t a的首地址的首地址 *a,*a0,a00,*t,*t0 元素元素a00的值的值a,*a,a0,&a00,t a00的地址的地址 *(*(a+1)+2),*(*(t+1)+2) 元素元素a12的值的值a+1,t+1 a10的地址的地址 *(*a+1),*(*t+1),*(t0+1), 元素元素a01的值的值*a+1,a0+1,*t+1, a01的地址的地址 *(a0+1),*(&a00+1),&a00+1 a01a+i,t+i ai0的地址的地址 *(*(a+i)+j),*(*t+i)+j) 元素元素aij的值的值*a+4i+j,*(t+i)+j, aij的地址的地址 *(*a+4

139、i+j),*(*(t+i)+j), 元素元素aij的值的值a0+4i+j, &aij *(a0+4i+j),*(ti+j),&a00+4i+j *(&a00+4i+j),aij课件制作:刘达明课件制作:刘达明 023-66834110氢矗围方棠琐捷篷碘甘馁胆熔采疲手矿撼编搬躇憾竞锥隐敝螺屈疲拉足外第4章指针与数组第4章指针与数组指针小结指针小结(第四章(第四章 指针与数组)指针与数组)107/113指针小结指针小结( (续续4)4):行指针行指针:int a34,(*t)4; t=a;或t=a0;或t=&a0;或t=&a00;列指针列指针:int a34,*p; p=a;或p=a0;或p=&a

140、0;或p=&a00;值值 数组元素数组元素 序号序号 存储单元存储单元 3 a0 0 0 4 a0 1 1 5 a0 2 2 6 a0 3 3 7 a1 0 4 8 a1 1 5 9 a1 2 6 0 a1 3 7 1 a2 0 8 2 a2 1 9-3 a2 2 10-4 a2 3 11200020022004200620082010201220142016201820202022t,at+1,a+1t+2,a+2p,ap+1,*a+1p+4,*a+4*t+1,*a+1*(t+1)+2,*(a+1)+2p+6,*a+6*t,*a*(*t+1),*(*a+1)*(t+1),*(a+1)*(*(

141、t+1)+2),*(*(a+1)+2)*t+2*4+2,*a+2*4+2*(*t+2*4+2),*(*a+2*4+2)p+8,*a+8p+2*4+2,*a+2*4+2*p,*a*(p+1),*(*a+1)*(p+4),*(*a+4)*(p+6),*(*a+6)*(p+2*4+2),*(*a+2*4+2)元素值描述元素值描述 地址描述地址描述地址描述地址描述 元素值描述元素值描述课件制作:刘达明课件制作:刘达明 023-66834110太潘苛兴搜局锦塘深浦专虫换龋后死氛墓鸵已焚愈虎蛇姬帽繁梯半丢剃讽第4章指针与数组第4章指针与数组指针小结指针小结(第四章(第四章 指针与数组)指针与数组)108/

142、113指针小结指针小结( (续续5)5):列指针程序列指针程序: (定义成:定义成:int *p;)main() int a34=1,2,3,4,5,6,7,8,9,10,11,12,*p; p=a0; /* 也可用也可用p=&a00;,p=a;,p=*a;,p=a0;,p=&a0; */ clrscr(); printf(*p=%dn,*p); /* *p= 1 */ printf(*a=%dn,*a); /* *a= 1 */ printf(*a0=%dn,*a0); /* *a0= 1 */ printf(p0=%dn,p0); /* p0= 1 */ printf(p-n); prin

143、tf(p1=%dn,p1); /* p1= 2 */ printf(p2=%dn,p2); /* p2= 3 */ printf(*(*a+1)+2)=%dn,*(*(a+1)+2); /* *(*a+1)+2)= 7 */ printf(*(p+2)=%dn,*(p+2); /* *(p+2)= 3 */ printf(*(p+2*4+3)=%dn,*(p+2*4+3); /* *(p+2*4+3)= 12 */课件制作:刘达明课件制作:刘达明 023-66834110眩筷克痊芝磕府粱竖檀垦担洋郭捐锨困春绅获旅府侠硫襟麻颤谰衣昭高纬第4章指针与数组第4章指针与数组指针小结指针小结(第四章(第

144、四章 指针与数组)指针与数组)109/113指针小结指针小结( (续续6)6):列指针程序列指针程序(续续): p+; printf(p+-n); printf(*p=%dn,*p); /* *p= 2 */ printf(*(*a+1)=%dn,*(*a+1); /* *(*a+1)= 2 */ printf(*(a0+1)=%dn,*(a0+1); /* *(a0+1)= 2 */ printf(*(&a00+1)=%dn,*(&a00+1); /* *(&a00+1)= 2 */ printf(*(p+2)=%dn,*(p+2); /* *(p+2)= 4 */ printf(p0=%d

145、n,p0); /* p0= 2 */ printf(p1=%dn,p1); /* p1= 3 */课件制作:刘达明课件制作:刘达明 023-66834110裹汁安伸蜀停弧剐聊任迹绞伸炕蚤孰娶禹窘寻馆吹蛊彬瓷筹埠佣梢玫厦吁第4章指针与数组第4章指针与数组指针小结指针小结(第四章(第四章 指针与数组)指针与数组)110/113指针小结指针小结( (续续7)7):行指针程序行指针程序: (定义成:定义成:int (*p)4;)main() int a34=1,2,3,4,5,6,7,8,9,10,11,12,(*p)4; p=&a0; /* 也可用也可用p=&a00;,p=a;,p=*a;,p=a0

146、;,p=&a0; */ clrscr(); printf(*p=%dn,*p); /* *p=1 */ printf(*a=%dn,*a); /* *a=1 */ printf(*a0=%dn,*a0); /* *a0 =1 */ printf(*p0=%dn,*p0); /* *p0=1 */ printf(p-n); printf(*p1=%dn,*p1); /* *p1=5 */ printf(*p2=%dn,*p2); /* *p2=9 */ printf(*(p2+1)=%dn,*(p2+1); /* *(p2+1)= 10 */ printf(*(*a+1)+2)=%dn,*(*(

147、a+1)+2); /* *(*a+1)+2)= 7 */ printf(*(p+2)=%dn,*(p+2); /* *(p+2)= 9 */ printf(*(*(p+2)+2)=%dn,*(*(p+2)+2); /* *(*(p+2)+2)= 11 */ printf(*(*p+2*4+3)=%dn,*(*p+2*4+3); /* *(*p+2*4+3)= 12 */课件制作:刘达明课件制作:刘达明 023-66834110氟篮辞淡攀恨袁阜弦锻祟屠催佛熊掘统昂卒毋基价胺夹几凉溉改抚凳辜剪第4章指针与数组第4章指针与数组指针小结指针小结(第四章(第四章 指针与数组)指针与数组)111/113指

148、针小结指针小结( (续续8)8):行指针程序行指针程序(续续): p+; printf(p+-n); printf(*p=%dn,*p); /* *p= 5 */ printf(*(*a+1)=%dn,*(*a+1); /* *(*a+1)= 2 */ printf(*(a0+1)=%dn,*(a0+1); /* *(a0+1)= 2 */ printf(*(&a00+1)=%dn,*(&a00+1); /* *(&a00+1)= 2 */ printf(*(*(p+1)+2)=%dn,*(*(p+1)+2); /* *(*(p+1)+2)= 11 */ printf(*p0=%dn,*p0)

149、; /* *p0= 5 */ printf(*p1=%dn,*p1); /* *p1= 9 */课件制作:刘达明课件制作:刘达明 023-66834110材凿殆海问锋墨剪距胖斧士踪馋染谩扇泡阶棵啄描固要喂吃丸他套屯恿浪第4章指针与数组第4章指针与数组指针小结指针小结(第四章(第四章 指针与数组)指针与数组)112/113指针小结指针小结( (续续9)9):在使用指针时,常常容易犯的一些错误:在使用指针时,常常容易犯的一些错误: 用指针引用数组元素(包括一维数组和二维数组)时,错误地认为对任何数组而言,数组名、第1行的首地址、数组第1个元素的首地址都具有相同的含义和功能,它们的相同之处是这三者地

150、址值都是相同的,但使用时根据不同的数组会有不同的特性。 在输出地址值时常常出现负值,这是由于在printf中使用了%d来输出地址,正确的做法应该采用%u(无符号整型)、%x(十六进制)、%o(八进制)、%p等格式输出地址。 对地址运算符&和指针运算符*的概念不清。实际上,如果有:int a=10,*p=&a;则:p、&a、&(*p)的值都为变量的地址值。而:a、*p、*&a的值都为10。 指针的运算:指针可以使用+、-、-=、+=、-、+等运算符加减一个整数。两个指针可以做减法,做加法并无实际意义。两个指针还可以进行比较运算。一个指针可以赋空值NULL。课件制作:刘达明课件制作:刘达明 023

151、-66834110直椽凄脐槐庆撒骋晰读锅候拓早痒幂抓夕介脓碳褐肤巾么跳阀袱愿君戊章第4章指针与数组第4章指针与数组第第4章章 指针与数组指针与数组-习题习题4113/113C语言程序设计语言程序设计 龙昭华主编 习习 题题 (四四)* 复习本章已讲内容,预习下一章内容。复习本章已讲内容,预习下一章内容。4.7 教材教材P130131的习题的习题4.1选择题中的第选择题中的第小题。小题。4.8 教材教材P132133的习题的习题4.3写结果中的第写结果中的第小题。小题。4.9 教材教材P133的习题的习题4.4编程题中的第编程题中的第小题。小题。课件制作:刘达明课件制作:刘达明 023-66834110锁兄矗贰括生殊损公狠冈脉谚氮勒荐决腋碴烫扁莫凉慷蒲洼偶弹悯吐莹锐第4章指针与数组第4章指针与数组

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号