C语言新教材PPT课堂课件-6-指针

上传人:re****.1 文档编号:567953270 上传时间:2024-07-22 格式:PDF 页数:79 大小:602.84KB
返回 下载 相关 举报
C语言新教材PPT课堂课件-6-指针_第1页
第1页 / 共79页
C语言新教材PPT课堂课件-6-指针_第2页
第2页 / 共79页
C语言新教材PPT课堂课件-6-指针_第3页
第3页 / 共79页
C语言新教材PPT课堂课件-6-指针_第4页
第4页 / 共79页
C语言新教材PPT课堂课件-6-指针_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《C语言新教材PPT课堂课件-6-指针》由会员分享,可在线阅读,更多相关《C语言新教材PPT课堂课件-6-指针(79页珍藏版)》请在金锄头文库上搜索。

1、1第第六六章章 指指针针主主要要内内容容:6.1 6.1 指指针针和和指指针针变变量量6.2 6.2 数数组组与与指指针针6.3 6.3 字字符符串串与与指指针针6.4 6.4 指指针针数数组组和和指指向向指指针针的的指指针针2i2000100 地地址址变变量量名名变变量量值值int i=100;假假设设为为i分分配配地地址址为为2000的的存存储储单单元元6.1 6.1 指指针针和和指指针针变变量量6.1.1 6.1.1 指指针针的的概概念念地地址址2000“指指向向”变变量量 i内内存存用用户户数数据据区区变变量量 i100地地址址2000注注意意:变变量量的的地地址址不不同同于于变变量量

2、名名可可用用&i获获取取32000100ii_pointerl指指针针变变量量:用用来来存存放放地地址址的的变变量量。将将地地址址2000存存放放在在变变量量i_pointer中中2000是是“变变量量的的地地址址”i_pointer称称为为“指指针针变变量量”4l指指针针的的概概念念 两两种种观观点点:1 1、指指针针是是指指针针变变量量的的简简称称。 C C语语言言之之父父丹丹尼尼斯斯里里奇奇:A pointer isa A pointer isa variable that contains the address of variable that contains the addres

3、s of a variable. a variable. 2 2、指指针针是是地地址址的的形形象象化化称称谓谓。 我我国国著著名名的的C C语语言言教教材材编编写写者者谭谭浩浩强强:变变量量的的地地址址称称为为该该变变量量的的“指指针针”。5指指针针是是C C的的精精华华,没没掌掌握握指指针针就就等等于于没没掌掌握握C C语语言言。l指指针针的的意意义义C程程序序设设计计中中使使用用指指针针可可以以:有有效效地地表表示示复复杂杂的的数数据据结结构构动动态态分分配配内内存存方方便便地地使使用用数数组组和和字字符符串串得得到到多多于于一一个个的的函函数数返返回回值值使使用用指指针针,可可以以使使程

4、程序序更更加加简简洁洁、紧紧凑凑、高高效效6l指指针针变变量量的的定定义义: 类类型型名名 * *指指针针变变量量名名;如如:intint *p ; *p ;定定义义 p p 为为指指向向整整型型(基基类类型型为为整整型型)的的指指针针变变量量,即即 p p 中中可可以以存存放放一一个个整整型型数数据据的的地地址址。6.1.2 指指针针变变量量的的定定义义“*”表表示示所所定定义义的的变变量量为为指指针针型型变变量量定定义义指指针针所所指指向向的的数数据据类类型型,也也叫叫“基基类类型型名名”71. 1. 取取地地址址运运算算符符 & & 用用法法:& &变变量量名名 功功能能:取取变变量量的

5、的地地址址 单单目目运运算算符符,“右右”结结合合性性,优优先先级级2 220003iC程程序序不不关关心心变变量量的的地地址址具具体体值值,需需要要地地址址时时,用用 &i 取取地地址址&i6.1.3 指指针针运运算算8四四、访访问问指指针针变变量量所所指指单单元元举举例例:如如果果有有定定义义 intint a,ba,b,*p; p=&a;,*p; p=&a; *p=78 *p=78; 等等价价于于 a=78 ;a=78 ; b=*p+4 b=*p+4; 等等价价于于 b=a+4 ;b=a+4 ;2.2.间间接接访访问问运运算算符符 * * 用用法法:* *指指针针变变量量名名 功功能能:

6、对对指指针针变变量量所所指指单单元元间间接接访访问问,即即引引用用指指针针变变量量所所指指单单元元的的值值 单单目目运运算算符符,“右右”结结合合性性,优优先先级级2 2注注意意:定定义义指指针针变变量量时时的的“*”*”与与其其它它位位置置出出现现的的“*”*”含含义义不不同同 前前者者表表示示p p是是指指针针变变量量 后后者者表表示示对对指指针针变变量量所所指指单单元元进进行行间间接接访访问问*p*p是是对对变变量量a a的的间间接接访访问问a a是是对对变变量量的的直直接接访访问问9l目目的的:将将指指针针变变量量指指向向一一个个存存储储单单元元三三、指指针针变变量量的的赋赋值值l指指

7、向向变变量量的的指指针针变变量量的的赋赋值值: 指指针针变变量量名名= =变变量量地地址址; 如如 intint a,*p; a,*p; p=&a ; p=&a ; l指指向向变变量量的的指指针针变变量量的的初初始始化化: 类类型型名名 * *指指针针变变量量名名= =变变量量地地址址; 如如 intint a , *p=&a ; a , *p=&a ;&aap注注意意指指针针变变量量初初始始化化中中,&a是是赋赋给给p,而而不不是是*p ; 不不允允许许用用具具体体地地址址值值赋赋值值,如如p=2000;10#include #include void main( )void main( )

8、 intint a,b,*pa,* a,b,*pa,*pbpb,*p;,*p; scanf(%d,%d,&a,&bscanf(%d,%d,&a,&b);); pa=&pa=&a;pba;pb=&b;=&b; 例例 通通过过指指针针变变量量实实现现两两个个数数的的交交换换(1)p=p=pa;papa;pa= =pb;pbpb;pb=p;=p;printf(aprintf(a=%=%d,bd,b=%=%dn,a,bdn,a,b ); );3 35 52000200020022002a ab bpa pa pbpbp p200020002002200220022000该该程程序序交交换换的的不不是是

9、a a、b b的的值值,而而是是交交换换两两个个指指针针变变量量的的值值(即即指指向向)。2000实实现现a、b交交换换了了吗吗?例例6.3-无无法法实实现现!11例例 通通过过指指针针变变量量实实现现两两个个数数的的交交换换(2)a ab bpapapbpbt t200020002002200220002000200220023 35 5printf(aprintf(a=%=%d,bd,b=%=%dndn, , a,ba,b ););该该程程序序交交换换的的是是两两个个指指针针变变量量所所指指单单元元的的值值,即即变变量量a a和和b b的的值值。5 53 3#include #includ

10、e void main( )void main( ) intint a,b,*pa,* a,b,*pa,*pb,pb,t t; ;/*非非int*t;*/ scanf(%d,%d,&a,&bscanf(%d,%d,&a,&b);); pa=&pa=&a;pba;pb=&b;=&b; t=*pa;*pa=*t=*pa;*pa=*pbpb;*;*pbpb=t;=t;3 3例例6.312指指针针变变量量与与普普通通变变量量的的对对比比l共共性性在在内内存存中中占占据据一一定定大大小小的的存存储储单单元元先先定定义义,后后使使用用类类型型定定义义后后不不能能改改变变(普普通通变变量量只只能能存存放放所

11、所定定义义类类型型的的数数据据,指指针针变变量量只只能能指指向向所所定定义义类类型型的的存存储储单单元元l特特殊殊性性指指针针变变量量的的内内容容只只能能是是地地址址,而而不不能能是是数数据据指指针针变变量量只只有有赋赋值值后后才才有有明明确确的的指指向向,否否则则无无确确定定的的所所指指存存储储单单元元可可访访问问136.2 6.2 数数组组与与指指针针6.2.1 指指向向一一维维数数组组的的指指针针l数数组组的的首首地地址址 用用数数组组名名表表示示int a 10 ;a14int a 10 ;一一、一一维维数数组组元元素素的的地地址址地地址址1 1aa+1a+3a+2a+6a+5a+4a

12、+9a+8a+7地地址址2 2&a0&a1&a2&a3&a4&a5&a6&a7&a8&a9a0a1a2a3a4a5a6a7a8a9下下标标法法元元素素引引用用元元素素地地址址相相邻邻元元素素的的地地址址偏偏移移量量为为115int a 10 ;二二、一一维维数数组组元元素素的的引引用用指指针针法法aa+1a+3a+2a+6a+5a+4a+9a+8a+7a0a1a2a3a4a5a6a7a8a9下下标标法法指指针针法法*a*(a+1)*(a+2)*(a+3)*(a+4)*(a+5)*(a+6)*(a+7)*(a+8)*(a+9)元元素素引引用用地地址址2 2&a0&a1&a2&a3&a4&a5&a

13、6&a7&a8&a9地地址址1 1元元素素地地址址ai与与*(a+i)等等价价16*(p+i)三三、指指向向一一维维数数组组元元素素的的指指针针变变量量l 指指向向数数组组元元素素的的指指针针变变量量的的定定义义: 类类型型名名 * 指指针针变变量量名名例例:intint a10 a10;intint *p; *p;p=a; p=a; 或或p=&a0;p=&a0;pp+iint a 10 ;a,&a0a+i, &aia0,*aai,*(a+i)*p或或 intint a10, *p=a; a10, *p=a;或或 intint a10, *p=&a0; a10, *p=&a0;指指针针位位移移

14、运运算算 p+ip+i: 指指针针变变量量p p位位移移 i i个个元元素素*(p+i)与与pi等等价价,p0,pi176.2.2 指指针针变变量量的的运运算算pp+5int a 10 ;a,&a0a+5, &a5a0,*aa5,*(a+ 5)指指针针比比较较运运算算 p2pp2p:地地址址值值大大小小比比较较。本本例例值值为为 1 1(真真)指指针针相相减减运运算算 p2-pp2-p:计计算算p2p2与与p p相相距距的的元元素素个个数数。本本例例值值为为5 5注注意意:只只有有对对数数组组指指针针变变量量进进行行位位移移、相相减减和和比比较较运运算算才才有有意意义义; 指指针针相相加加运运

15、算算无无意意义义。指指针针位位移移运运算算 p+ip+i:指指针针变变量量p p位位移移 i i个个元元素素p2,18(1)(1)指指针针变变量量的的值值可可以以改改变变, ,即即可可以以使使用用p+p+、p+=2p+=2、p-p-=3=3等等, , 作作用用是是相相对对于于当当前前位位置置前前移移或或后后移移若若干干个个存存储储单单元元。 数数组组名名本本身身表表示示数数组组的的首首地地址址, ,是是常常量量而而不不是是变变量量, ,故故不不能能对对数数组组名名进进行行自自增增自自减减或或赋赋值值运运算算。(2)(2)注注意意下下面面几几种种运运算算: : *p+ *p+与与* *(p+)(

16、p+)等等价价 (*(*与与+同同优优先先等等级级, ,右右结结合合性性) ) *(p+) *(p+)与与* *(+p)(+p)不不等等价价 ( (前前者者先先访访问问p p所所指指单单元元再再移移p p到到下下一一单单元元, ,后后者者先先移移p p到到下下一一单单元元再再访访问问) ) (*p)+ (*p)+与与* *(p+)(p+)不不等等价价 ( (前前者者是是被被访访问问单单元元值值加加1,1,后后者者是是指指针针值值加加1)1)l有有关关一一维维数数组组及及其其指指针针变变量量在在使使用用时时的的注注意意事事项项19一一维维数数组组元元素素输输入入和和输输出出#includevoi

17、dmain()inta10,i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%5d,ai);printf(n);方方法法一一:下下标标法法1#includevoidmain()inta10,*p=a,i;for(i=0;i10;i+)scanf(%d,&pi);printf(n);for(i=0;i10;i+)printf(%5d,pi);printf(n); 下下标标法法2p=a后后,p可可以以当当作作数数组组名名使使用用20一一维维数数组组元元素素输输入入和和输输出出#includevoidmain()inta1

18、0,i;for(i=0;i10;i+)scanf(%d,a+i);printf(n);for(i=0;i10;i+)printf(%5d,*(a+i);printf(n);方方法法二二:首首地地址址偏偏移移量量法法1#includevoidmain()inta10,*p=a,i;for(i=0;i10;i+)scanf(%d,p+i);printf(n);for(i=0;i10;i+)printf(%5d,*(p+i);printf(n); 首首地地址址偏偏移移量量法法221一一维维数数组组元元素素输输入入和和输输出出#includevoidmain()inta10,*p=a;for(;pa+

19、10;p+)scanf(%d,p);printf(n);for(p=a;pp1)pmax=p;pnmax=p+1;elsepmax=p+1;pnmax=p;for(i=2;i10;i+)if(*pmaxpi)pnmax=pmax;pmax=p+i;elseif(*pnmaxpi)pnmax=p+i;printf(max=%d,nmax=%dn,*pmax,*pnmax);习习题题6.2 用用指指针针方方法法求求数数组组元元素素中中的的最最大大值值与与次次最最大大值值 236.2.3 指指向向二二维维数数组组的的指指针针一一、二二维维数数组组的的地地址址int a 34;aa00 a01 a02

20、 a03a10 a11 a12 a13a20 a21 a22 a23逻逻辑辑结结构构a00a01a02a03a10a11a12a13a20a21a22a23存存储储结结构构l二二维维数数组组的的物物理理结结构构:在在内内存存中中占占用用连连续续的的存存储储单单元元,数数组组名名为为首首地地址址a+1指指向向何何方方?24l可可以以将将二二维维数数组组的的每每一一行行看看作作一一个个一一维维数数组组(一一)二二维维数数组组的的行行地地址址aa+1a+2行行地地址址l将将二二维维数数组组a看看作作一一个个特特殊殊的的一一维维数数组组,由由3个个特特殊殊元元素素组组成成,每每个个特特殊殊元元素素分分

21、别别为为一一个个大大小小为为4的的一一维维数数组组,数数组组名名分分别别为为a0、a1和和a2注注意意: 二二维维数数组组的的数数组组名名a是是行行地地址址; a+i是是指指向向第第 i 行行。25 (二二)二二维维数数组组的的元元素素地地址址 第第1 1行行是是数数组组名名为为a1a1的的一一维维数数组组a1a1+1a1+2a1+3注注意意:ai是是第第 i 行行首首元元素素的的地地址址,不不是是元元素素的的引引用用!元元素素地地址址26a00a02a12a13a03a23a20a11a21a22a10a01二二维维数数组组的的元元素素地地址址 元元素素 aij 地地址址的的几几种种表表示示

22、形形式式: &aij (取取地地址址运运算算) a0+4*i+j (从从数数组组首首元元素素地地址址算算起起) ai+j (从从行行首首元元素素地地址址算算起起) *(a+i)+j (从从首首行行地地址址算算起起) a0a0+4或或a1a0+8或或a2a0+1a0+6或或a1+2a0+11或或a2+3a0为为首首元元素素地地址址27例例6.10确确定定数数组组每每个个成成分分的的大大小小。#include void main()int a34=0,1,2,3,4,5,6,7,8,9,10,11; printf (The size of a=%un,sizeof(a); printf(The s

23、ize of a0=%un,sizeof(a0); printf(The size of a00=%un,sizeof(a00 );程程序序运运行行的的结结果果:Thesizeofa24Thesizeofa08Thesizeofa002可可见见,a a表表示示整整个个数数组组;a a00表表示示数数组组的的一一行行;a a0000仅仅表表示示一一个个元元素素。28二二、指指向向二二维维数数组组元元素素的的指指针针变变量量l指指向向数数组组元元素素的的指指针针变变量量的的定定义义: 类类型型名名 * *指指针针变变量量名名如如果果有有:intint a34,*p; a34,*p;p=&a00;

24、p=&a00; 或或 p=a0;p=a0;则则指指针针变变量量p p指指向向了了数数组组元元素素a00a00,于于是是,* *p p等等价价于于a00a00。注注意意:指指向向数数组组元元素素的的指指针针变变量量的的一一个个偏偏移移量量是是指指针针移移动动一一个个元元素素,即即指指针针变变量量的的值值加加1 1,则则指指向向下下一一个个元元素素。p=a; 可可以以吗吗?TC+3.0不不允允许许!TC2.0允允许许,但但概概念念不不清清!29举举例例 输输出出二二维维数数组组中中的的全全部部元元素素用用元元素素指指针针处处理理#includevoidmain()inta34=1,3,5,7,9,

25、11,13,15,17,19,21,23;int*p;for(p=a0;pa0+12;p+)if(p-a0%4=0)printf(n);printf(%4d,*p);例例6.12 指指针针移移动动法法30举举例例 输输出出二二维维数数组组中中的的全全部部元元素素用用元元素素指指针针处处理理#includevoidmain()inta34=1,3,5,7,9,11,13,15,17,19,21,23;int*p,i;p=a0;for(i=0;i12;i+)if(i%4=0)printf(n);printf(%4d,*(p+i);另另解解:首首地地址址偏偏移移量量法法for(i=0;i3;i+)p

26、rintf(n);for(j=0;j4;j+)printf(%4d,*(p+i*4+j);或或:31三三、指指向向行行数数组组的的指指针针变变量量l行行指指针针变变量量的的定定义义:类类型型名名(*行行指指针针变变量量名名)N说说明明:定定义义行行指指针针变变量量存存放放行行地地址址,指指向向指指定定类类型型、列列数数为为N的的二二维维数数组组的的行行。例例如如:inta34,(*p)4;p=a;则则:行行指指针针变变量量p指指向向了了整整型型、具具有有4个个列列的的二二维维数数组组a的的首首行行。注注意意:行行指指针针p p的的大大小小必必须须和和二二维维数数组组a a的的列列数数一一致致;

27、 行行指指针针p+ip+i,表表示示使使行行指指针针从从当当前前位位置置开开始始,向向下下移移动动i i个个偏偏移移量量,每每个个偏偏移移量量为为一一行行。32举举例例 输输出出二二维维数数组组中中的的全全部部元元素素用用行行指指针针处处理理#includevoidmain()inta34=1,3,5,7,9,11,13,15,17,19,21,23;int(*p)4=a,i,j;for(i=0;i3;i+)printf(n);for(j=0;j4;j+)printf(%4d,*(*(p+i)+j);P165例例6.12另另解解行行指指针针p被被赋赋予予a后后,p可可以以当当作作二二维维数数组

28、组名名使使用用或或pij336.3 6.3 字字符符串串与与指指针针一一、字字符符串串和和字字符符串串结结束束标标志志 l字字符符串串常常量量: 两两个个双双引引号号之之间间的的字字符符序序列列叫叫做做字字符符串串常常量量,如如 abcdefgabcdefg 。l字字符符串串结结束束标标志志:系系统统自自动动为为每每一一个个字字符符串串常常量量加加一一个个字字符符串串结结束束标标志志0,在在内内存存中中也也占占一一个个字字节节。(注注:0的的ASCII值值为为0)l字字符符串串常常量量的的存存储储长长度度:字字符符串串中中有有效效字字符符的的个个数数加加1 1。l系系统统将将字字符符串串常常量

29、量按按一一维维字字符符数数组组处处理理。34字字符符常常量量和和字字符符串串常常量量的的区区别别35二二、字字符符数数组组和和指指向向字字符符串串的的指指针针变变量量(6.3.26.3.4 ) C C语语言言没没有有字字符符串串变变量量,可可以以通通过过以以下下两两种种方方法法实实现现对对字字符符串串的的处处理理l字字符符数数组组l字字符符指指针针变变量量36(一一)字字符符串串的的定定义义str1是是常常量量str2是是变变量量37(二二)字字符符串串的的赋赋值值(=)38(三三)字字符符串串的的输输入入39字字符符串串输输入入举举例例a a b b0? ? ? ? ?char c10; s

30、canf(%s, c);如如果果从从键键盘盘上上输输入入:aabbcc gets(c);aab bcc 0 ?如如果果从从键键盘盘上上输输入入:aabbcc lgets函函数数格格式式:gets(串串地地址址)l功功能能:从从键键盘盘上上输输入入一一个个字字符符串串到到指指定定地地址址开开始始的的存存储储空空间间中中。(P174)对对s,回回车车或或空空格格是是输输入入结结束束符符,并并自自动动转转换换成成0存存储储对对gets,回回车车是是输输入入结结束束符符,并并自自动动转转换换成成0存存储储40(四四)字字符符串串的的输输出出或或 stristri或或 *p*p不不常常用用这这类类方方式

31、式输输出出字字符符串串,但但常常用用这这类类方方式式控控制制字字符符的的逐逐一一处处理理。41puts( )函函数数使使用用举举例例abcd?#includevoidmain()charc10;inti;for(i=0;i4;i+)ci=a+i;puts(c);ci=0;abcd0?abcd随随机机字字符符abcd(输输出出后后换换行行)c:lputs函函数数格格式式:puts(字字符符串串)l功功能能:输输出出指指定定的的字字符符串串,并并自自动动将将0转转换换为为回回车车换换行行(n)输输出出。(P175)42 字字符符串串输输出出:puts(puts(串串) ) 字字符符串串输输入入:g

32、ets(gets(串串地地址址) ) 串串2 2复复制制到到串串1 1:strcpystrcpy( (串串1 1地地址址, ,串串2 2) ) 串串1 1串串2 2大大小小比比较较:strcmpstrcmp( (串串1,1,串串2 2) ) 串串2 2连连接接到到串串1 1:strcatstrcat( (串串1 1地地址址, ,串串2 2) ) 求求串串的的实实际际长长度度:strlenstrlen( (串串) ) 串串大大小小写写转转换换:strlwrstrlwr( (串串) ) ,struprstrupr( (串串) ) #include #include stdio.hstdio.h #

33、include string.h#include string.h二二、字字符符串串处处理理函函数数 (6.3.5 +6.3.6)串串常常量量或或串串地地址址43strcpy( )函函数数字字符符串串复复制制函函数数l格格式式: : strcpystrcpy( (串串1 1地地址址, ,串串2)2)l功功能能:将将字字符符串串2 2(连连同同结结束束标标志志0)复复制制到到串串1 1地地址址所所指指的的存存储储空空间间中中。注注意意:串串1 1地地址址所所指指的的存存储储空空间间必必须须已已分分配配且且足足够够大大,以以便便容容纳纳字字符符串串2 2。44strcpy()函函数数应应用用举举例

34、例: #include #include void main( ) char a6=China, b=FZ; strcpy(a,b ) ; strcpy(b, 10) ; puts( a ); puts( b); 输输出出:FZ10不不允允许许:a=b;b=10;45P178P178例例6.216.21 将将字字符符串串s1s1复复制制到到字字符符串串s2s2,即即实实现现:strcpy(s2,s1)strcpy(s2,s1) 下下标标法法 字字符符指指针针法法编编程程实实现现strcpy( )功功能能46#include void main ( ) char s1 =Hello,World!

35、,s215; char *from=s1,*to=s2; while(*from) /*代代表表while(*from!=0)*/ *to=*from; to+; from+; *to=0; puts(s1); puts(s2); 例例6.21实实现现strcpy(s2,s1)字字符符指指针针法法:47 while(*from) *to=*from; to+; from+; *to=0;简简化化 while(*from) *to+=*from+; *to=0;例例6.21的的以以下下程程序序段段可可简简化化: 简简化化 while( (*to+=*from+)!=0 ) ;48strcat(

36、)函函数数字字符符串串连连接接函函数数l格格式式: : strcatstrcat( (串串1 1地地址址, ,串串2)2)l功功能能:将将字字符符串串2 2(连连同同结结束束标标志志0)接接到到字字符符串串1 1的的后后面面(0位位置置开开始始) 。例例:#include #include void main( ) char c120=abcde, *c2=12345; strcat( c1 , c2 ) ; puts( c1 ); 输出: abcde12345注注意意:串串1 1地地址址所所指指的的存存储储空空间间必必须须已已分分配配且且足足够够大大,以以便便容容纳纳连连接接后后的的新新字字

37、符符串串。49P179P179例例6.236.23 将将字字符符串串s2s2连连接接到到字字符符串串s1s1的的后后面面, ,即即实实现现:strcat(s1,s2)strcat(s1,s2) 下下标标法法 字字符符指指针针法法编编程程实实现现strcat( )功功能能50strcmp( )函函数数字字符符串串比比较较函函数数l格格式式:strcmpstrcmp( (串串1,1,串串2)2)l功功能能:比比较较字字符符串串1 1和和字字符符串串2 2的的大大小小l比比较较方方式式:逐逐个个字字符符比比较较;按按ASCIIASCII码码比比较较;遇遇到到第第一一对对不不同同的的字字符符或或者者有

38、有一一个个字字符符串串结结束束停停止止。l返返回回值值:返返回回两两个个字字符符串串中中第第一一对对不不同同字字符符的的ASCIIASCII码码值值之之差差。 若若返返回回值值等等于于0 0,表表示示串串1 1等等于于串串2 2; 若若返返回回值值大大于于0 0,表表示示串串1 1大大于于串串2 2; 若若返返回回值值小小于于0 0,表表示示串串1 1小小于于串串2 2。 51strcmp(abcde,ad )b-d=-2strcmp(abcde,ad)=-2abcde小小于于adad0abcde0strcmp(abcde,ab )c-0=99strcmp(abcde,ab)=99abcde大

39、大于于abab0abcde0strcmp(ab,ab )0-0=0strcmp(ab,ab)=0两两串串相相等等ab0ab 0strcmp( )函函数数比比较较过过程程52#includevoidmain()chars180,s280,*str1=s1,*str2=s2;inti,d=0;printf(Inputstrings1ands2:n);gets(str1);gets(str2);while(*str1&*str2)/*str1、str2均均未未到到0*/d=*str1-*str2;if(d!=0)break;/*对对应应字字符符不不等等,结结束束比比较较*/str1+,str2+;i

40、f(d=0)/*前前一一对对字字符符相相等等,本本对对字字符符中中至至少少一一个个是是0*/d=*str1-*str2;printf(%dn,d); 编编程程实实现现strcmp( )功功能能P178例例6.22利利用用字字符符指指针针比比较较字字符符串串s1和和s2的的大大小小,即即实实现现strcmp(s1,s2)53#includevoidmain()chars180,s280,*str1=s1,*str2=s2;inti,d;printf(Inputstrings1ands2:n);gets(str1);gets(str2);while(*str1=*str2&*str1)str1+,

41、str2+;d=*str1-*str2;printf(%dn,d);例例6.22算算法法改改进进编编程程实实现现strcmp( )功功能能/*当当对对应应字字符符相相等等且且均均未未到到0,继继续续比比较较下下一一对对字字符符*/54strlen( )函函数数求求字字符符串串实实际际长长度度函函数数l格格式式: strlenstrlen( (字字符符串串) )l功功能能: 求求字字符符串串的的实实际际长长度度, ,不不包包括括00。l返返回回值值:返返回回整整型型数数据据,其其大大小小为为字字符符串串中中有有效效字字符符的的个个数数。#include #include void main (

42、) char a10=12345 ; char *b=123045; char *c=123085; char d5=12345; char *e=12345; printf(%dn%dn%dn%dn%dn,strlen(a), strlen(b),strlen(c),strlen(d),strlen(e); 输输出出:6 43(不不确确定定数数)5045是是转转义义字字符符!55#include void main ( ) char s180,*str1=s1; int len=0; gets(str1); while(*str1!=0) len+; str1+; printf(len=%d

43、n, len); 编编程程实实现现strlen( )功功能能56strlwr( )函函数数转转换换生生成成小小写写字字母母串串l格格式式: strlwrstrlwr( (字字符符串串) )l功功能能: 将将字字符符串串中中的的大大写写字字母母转转换换成成小小写写字字母母,其其它它字字符符不不变变strupr( )函函数数转转换换生生成成大大写写字字母母串串l格格式式: struprstrupr( (字字符符串串) )l功功能能: 将将字字符符串串中中的的小小写写字字母母转转换换大大写写字字母母,其其它它字字符符不不变变57#include void main ( ) char s1 =BeiJ

44、ing2008, *str1; str1=s1; while(*str1!=0) if (*str1=A) & (*str1=Z) *str1+=32; str1+; puts(s1); P180例例6.24(1)实实现现:strlwr(s1)编编程程实实现现strlwr( )功功能能58三三、字字符符串串应应用用举举例例l 字字符符串串复复制制(不不用用strcpystrcpy函函数数)l 字字符符串串连连接接(不不用用strcatstrcat函函数数)l 字字符符串串比比较较(不不用用strcmpstrcmp函函数数)l 求求字字符符串串实实际际长长度度l 转转换换生生成成小小写写字字母母

45、串串(不不用用strlwrstrlwr函函数数)-l 将将字字符符串串反反向向l 删删除除串串中中空空格格l 将将数数字字串串转转换换为为整整型型数数l 将将正正整整数数转转换换为为数数字字串串l 将将十十进进制制正正整整数数转转换换为为十十六六进进制制数数l 字字符符串串加加密密59#includevoidmain()charstr50,*p1,*p2,temp;printf(Enterstring:);gets(str);p1=p2=str;while(*p1)p1+;/*找找到到串串结结束束标标记记0*/p1-;/*指指针针p1指指向向串串中中的的最最后后一一个个字字符符*/while(

46、p2p1)temp=*p2;/*交交换换两两个个指指针针所所指指向向的的字字符符*/*p2+=*p1;/*p2向向串串尾尾方方向向移移一一位位*/*p1-=temp;/*p1向向串串首首方方向向移移一一位位*/puts(str);例例6.27举举例例 将将字字符符串串反反向向60举举例例 删删除除一一个个字字符符串串中中所所有有的的空空格格字字符符例例6.256.25p1依依次次指指向向删删空空格格前前的的s串串的的各各个个字字符符p2依依次次指指向向接接收收非非字字符符的的各各个个位位置置*p1为为空空格格 61#includevoidmain()chars8,*p=s;longintn=0

47、;intd;gets(s);while(*p)d=*p-0;n=n*10+d;p+;printf(%ldn,n);例例6.26如如:12341234思思路路:123411n=1123422n=n*10+2=12123433n=n*10+3=123123444n=n*10+4=1234-|-|-*pd=*p-0n=n*10+d举举例例 将将数数字字串串转转换换为为整整型型数数将将数数字字字字符符转转换换为为数数字字值值,或或*p-4862如如:12341234思思路路:a=123444s=4a=12333s=43a=1222s=432a=111s=4321|-|-|-ab*p=a/10a%10b

48、+0举举例例 将将正正整整数数转转换换为为数数字字串串将将数数字字字字符符转转换换为为数数字字值值,或或*p-48#include#includevoidmain()longa;chars8,*p=s;intb,i;scanf(%ld,&a);while(a0)b=a%10;*p=0+b;a=a/10;p+;*p=0;将将s串串反反向向存存放放后后输输出出或或直直接接反反序序输输出出63如如:12344D2思思路路:a=1234b=a%16=22s=2a=a/16=77b=a%16=13Ds=2Da=a/16=4b=a%16=44s=2D4|-|-|-ab*p=a/16a%16b+0(b9)举

49、举例例 将将十十进进制制正正整整数数转转换换为为十十六六进进制制数数 09之之间间的的数数转转换换为为十十六六进进制制数数码码091015之之间间的的数数转转换换为为十十六六进进制制数数码码AF64举举例例 字字符符串串加加密密l密密码码转转换换规规律律: 假假设设k=4k=4,将将字字母母A A变变成成字字母母E E,字字母母a a变变成成e e,即即变变成成其其后后的的第第四四个个字字母母,字字母母W W变变成成A A,X X变变成成B B,Y Y变变成成C C,Z Z变变成成D D。非非字字母母不不变变。A65MGRDV 86B66C6769 E 70 FIJKLNOPQSTUW 87X

50、 88YZ90H习习题题4.284.28 先先输输入入数数字字k(0k10),再再将将输输入入的的一一行行字字符符中中的的英英文文字字母母转转换换为为其其后后续续的的第第k个个字字母母输输出出,字字母母超超出出最最后后一一个个“Z”或或“z”时时,循循环环转转换换,数数字字不不转转换换。65getchargetchar()()用用来来“吃吃掉掉”跟跟在在k k值值后后输输入入的的回回车车键键字字符符串串加加密密程程序序#includevoidmain()chars80,*p=s;intk;printf(inputk:);scanf(%d,&k);printf(inputstring:);get

51、char();gets(s);puts(s);while(*p!=0)p+;if(*p=A&*p=a&*pZ&*pz&*p=z+k)*p=*p-26;习习题题4.28运运行行举举例例:input k: 3input string:Agte%f32xz7YDjwh%i32ac7B66补补遗遗:字字符符数数组组的的初初始始化化举举例例chara5=1234charb35=1234,ABCD,abcd;或或:chara5=1234charb35=1234,ABCD,abcd;charb35=1,2,3,4,0,A,B,C,D,0,a,b,c,d,0;以以下下不不提提倡倡使使用用:chara5=1,2

52、,3,4,0charb35=1,2,3,4,0,A,B,C,D,0,a,b,c,d,0;以以上上各各数数组组的的第第一一维维大大小小均均可可省省!676.4 指指针针数数组组和和指指向向指指针针的的指指针针l一一个个数数组组,如如果果其其中中的的各各个个元元素素均均为为指指针针类类型型,则则这这个个数数组组称称为为指指针针数数组组。l如如果果一一个个指指针针变变量量指指向向指指针针类类型型的的数数据据,则则这这个个指指针针变变量量称称为为指指向向指指针针的的指指针针。l主主要要应应用用在在字字符符串串处处理理上上68一一、指指针针数数组组的的概概念念l指指针针数数组组的的定定义义:类类型型名名

53、*数数组组名名常常量量表表达达式式;如如:int*p4;表表示示数数组组p是是一一个个具具有有4个个元元素素的的一一维维数数组组,每每个个数数组组元元素素都都是是一一个个指指向向整整型型数数据据的的指指针针,即即每每个个元元素素都都是是一一个个整整型型变变量量的的地地址址。注注意意区区别别:int(*p)4;行行指指针针int*p4;指指针针数数组组69例例6.29通通过过指指针针数数组组元元素素访访问问int型型二二维维数数组组的的元元素素。#includevoidmain()inta34=0,1,2,3,4,5,6,7,8,9,3,6;int*pa3;inti,j;for(i=0;i3;i

54、+)pai=ai;for(i=0;i3;i+)for(j=0;j4;j+)printf(a%d%d=%d,i,j,*(pai+j);/*(pai+j)与与*(ai+j)、*(*(a+i)+j)、aij均均等等效效*/printf(n);指指针针数数组组的的元元素素只只能能存存放放地地址址!指指向向首首元元素素70二二、字字符符指指针针数数组组与与二二维维字字符符数数组组应应用用比比较较二二维维字字符符数数组组定定义义char char s68=FORTRAN,s68=FORTRAN,PASCAL,BASIC,COBOLPASCAL,BASIC,COBOL,C,C+ ; ,C,C+ ; 字字符符

55、指指针针数数组组定定义义char *ps6=FORTRAN,char *ps6=FORTRAN,PASCAL,BASIC,COBOL,PASCAL,BASIC,COBOL,C,C+ ; C,C+ ; 结结论论一一:处处理理不不等等长长字字符符串串时时,字字符符指指针针数数组组比比二二维维字字符符数数组组节节省省存存储储空空间间。二二维维字字符符数数组组s每每行行存存放放一一个个字字符符串串,按按最最长长串串的的长长度度为为各各串串分分配配存存储储空空间间指指针针数数组组ps每每个个元元素素存存放放一一个个字字符符串串的的首首地地址址,按按各各串串实实际际长长度度分分配配存存储储空空间间指指向向

56、首首字字符符71举举例例:将将若若干干个个字字符符串串按按升升序序输输出出 char temp8; int i,j,k; for(i=0;i5;i+) /*选选择择排排序序法法*/ k=i; for(j=i+1;j0) k=j; if (k!=i) strcpy(temp,sk); srrcpy(sk, si); strcpy(si,temp); 排排序序后后的的字字符符数数组组解解1 1)例例6.286.28用用二二维维字字符符数数组组核核心心程程序序段段:交交换换sk与与si所所存存放放的的字字符符串串,实实质质上上是是逐逐个个字字符符交交换换72将将若若干干个个字字符符串串按按升升序序输

57、输出出 char *temp; int i,j,k; for(i=0;in-1;i+) /*选选择择排排序序法法*/ k=i; for(j=i+1;j0) k=j; if (k!=i) temp=psk; psk=psi; psi=temp; 结结论论二二:用用指指针针数数组组指指向向若若干干个个字字符符串串,使使字字符符串串处处理理更更加加方方便便灵灵活活。解解2 2)例例6.316.31用用指指针针数数组组核核心心程程序序段段:排排序序后后的的指指针针数数组组交交换换psk与与psi的的指指向向,比比交交换换字字符符串串节节省省时时间间73三三、二二级级指指针针(指指向向指指针针的的指指针

58、针)l二二级级指指针针的的定定义义:类类型型名名 *变变量量名名; ;如如: : intint a, *p=&a, *pp=&p; a, *p=&a, *pp=&p;表表示示p p是是一一个个指指针针变变量量,指指向向变变量量a a,*p*p等等价价于于a a;pppp是是一一个个指指向向指指针针的的指指针针,指指向向指指针针变变量量p p,*pp*pp等等价价于于p p, *pp*pp等等价价于于* *p p,即即等等价价于于a a 。 如如果果要要想想将将常常量量8 8赋赋给给变变量量a a,可可以以有有如如下下的的使使用用方方法法: a=8; a=8; 或或者者: *p=8; : *p=

59、8; 或或者者: *pp=8;: *pp=8;l结结论论: : 使使用用二二级级指指针针,可可以以进进行行多多级级间间接接访访问问 74举举例例: 使使用用二二级级指指针针引引用用字字符符串串#include void main ( )char *ps6=FORTRAN,PASCAL,BASIC,COBOL,C,C+; char *pp; int i; pp=ps; /*pp指指向向指指针针数数组组的的首首地地址址*/ for(i=0;i6;i+) puts(*pp+); 例例6.346.34或: for (pp=ps;ppps+6;pp+) puts(*pp); 运运行行结结果果:FORTR

60、ANPASCALBASICCOBOLCC+75#include#includevoidmain()char*ps6=FORTRAN,PASCAL,BASIC,COBOL,C,C+,s20;char*pp=ps;inti;gets(s);/*输输入入要要查查找找的的字字符符串串*/for(i=0;i6;i+)if(strcmp(*pp,s)=0)printf(%dn,i+1);break;/*查查到到,输输出出其其所所在在的的位位置置,退退出出循循环环*/pp+;/*未未查查到到,指指向向下下一一字字符符串串*/if(i=6)printf(Notfoundn);例例6.356.35举举例例: 字

61、字符符串串查查找找76指指针针小小结结定定义义 int *p; int (*p)4; int *p4; int *p;指指向向int型型数数据据的的指指针针指指向向int型型二二维维数数组组的的行行的的指指针针指指针针数数组组, 由由4个个指指针针元元素素组组成成指指向向指指针针的的指指针针指指针针在在使使用用前前一一定定要要有有明明确确的的指指向向 指指针针变变量量值值为为NULLNULL :表表示示该该指指针针变变量量不不指指向向任任何何变变量量。77指指针针小小结结l缺缺点点:易易出出大大错错l使使用用指指针针的的优优点点:有有效效地地表表示示复复杂杂的的数数据据结结构构动动态态分分配配

62、内内存存方方便便地地使使用用数数组组和和字字符符串串得得到到多多于于一一个个的的函函数数返返回回值值(下下章章介介绍绍)使使程程序序更更加加简简洁洁、紧紧凑凑、高高效效。78 动动态态分分配配存存储储区区函函数数返返回回voidvoid类类型型指指针针 void *malloc(字字节节数数) :分分配配指指定定字字节节数数的的连连续续空空间间,返返回回值值是是一一个个voidvoid型型指指针针,指指向向所所分分配配空空间间的的首首地地址址。 动动态态分分配配内内存存 指指针针类类型型为为voidvoid(空空):表表示示暂暂不不指指定定该该指指针针指指向向哪哪种种类类型型,待待需需要要引引

63、用用时时,需需进进行行强强制制类类型型转转换换使使之之适适合合于于被被赋赋值值变变量量的的类类型型。例例如如:动动态态分分配配一一个个int型型单单元元,用用int型型指指针针变变量量pn指指向向它它int*pn;pn=(int*)malloc(sizeof(int);了了解解79#include#includevoidmain()int*p=NULL,n,i;floatsum;printf(Pleaseenterarraysize:);scanf(%d,&n);p=(int*)malloc(n*sizeof(int);/*动动态态分分配配n个个int型型单单元元,p为为首首地地址址,即即得得动动态态数数组组pn*/if(p=NULL)printf(Noenoughmemory!n);exit(0);/*终终止止程程序序*/printf(Pleaseinput%dnumbers:,n);for(i=0;in;i+)scanf(%d,p+i);/*或或&pi*/for(sum=0,i=0;in;i+)sum+=*(p+i);/*或或pi*/printf(aver=%.2fn,sum/n);free(p);/*释释放放动动态态分分配配的的空空间间*/动动态态内内存存分分配配的的应应用用举举例例: 一一维维动动态态数数组组了了解解

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

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

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