版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第1919讲讲 指针数组指针数组教学目的与要求:教学目的与要求: 掌握指针数组和指向指针的指针的使用掌握指针数组和指向指针的指针的使用 了解带参数的了解带参数的mainmain()函数()函数教学内容提要:教学内容提要: 1.1.指针数组指针数组 2.2.指针数组作指针数组作mainmain的参数的参数 3.3.有关指针的小结有关指针的小结教学重点:教学重点:指针数组和指向指针的指针的使用指针数组和指向指针的指针的使用 教学难点:教学难点:指针数组和指向指针的指针的使用指针数组和指向指针的指针的使用教学进度:教学进度:P242P246P242P2462 一、指针数组一、指针数组 指针数组:
2、是指针变量的集合。即它的每一个元素指针数组:是指针变量的集合。即它的每一个元素都是指针变量,且都具有相同的存储类别和指向都是指针变量,且都具有相同的存储类别和指向相同的数据类型。相同的数据类型。指针数组的定义形式为:指针数组的定义形式为: 类型标识符类型标识符 * *数组名数组名 数组长度说明数组长度说明 ;例如:例如: int int * *p10;p10;由于由于 比比* *的优先级高,因此的优先级高,因此p p先与先与 1010结合成结合成p10p10,而,而p10p10正是数组的定义形式,共有正是数组的定义形式,共有1010个个元素。最后元素。最后p10p10与与* *结合结合, ,表
3、示它的各元素可以指表示它的各元素可以指向一个整型变量。向一个整型变量。3指针数组广泛应用于对字符串的处理指针数组广泛应用于对字符串的处理例如有定义:例如有定义: char *p3;定义了一个具有三个元素定义了一个具有三个元素p0,p1,p2的指针的指针数组。每个元素都可以指向一个字符数组,或数组。每个元素都可以指向一个字符数组,或字符串。字符串。若利用数组初始化,则:若利用数组初始化,则:char *p3= “Basic”, “c+”, “pascal”; P0指向字符串指向字符串“Basic”;P0指向字符串指向字符串“c+”;P0指向字符串指向字符串“pascal” ;4 char nam
4、e59=“gain”,“much”,“stronger”, “point”,“bye”; char *name5=“gain”,“much”,“stronger”, “point”,“bye”;g a i n 0s t r o n g e r 0p o i n t 0m u c h 0name0name1name2name3name4b y e 0g a i n 0s t r o n g e r 0p o i n t 0m u c h 0b y e 0二维数组存储空间固定二维数组存储空间固定字符指针数组相当于字符指针数组相当于可变列长可变列长的二维数组的二维数组分配内存单元分配内存单元=数组维
5、数数组维数*2+各字符串长度各字符串长度指针数组元素的作用相当于二维数组的行名指针数组元素的作用相当于二维数组的行名但指针数组中元素是指针变量但指针数组中元素是指针变量二维数组的行名是二维数组的行名是地址常量地址常量二维数组与指针数组区别二维数组与指针数组区别:5例例 字符指针数组的赋值字符指针数组的赋值 #define NULL 0 main( ) static char a =“Fortran”; static char b =“COBOL”; static char c =“Pascal”; int i; char *p4; p0=a; p1=b; p2=c; p3=NULL; for
6、(i=0;pi!=NULL;i+) printf(“Language %d is %sn”,i+1,pi); 6例例 有若干本书,将书名按字典顺序排序有若干本书,将书名按字典顺序排序#include#includemain() char *bname=Programming in ANSI C,BASIC,Visual C+ 6.0 Programming ,TRUBO C 2.0; int i,m; void sort(char *name,int); m=sizeof(bname)/sizeof(char *); /*字符串个数字符串个数*/ sort(bname,m); /* 排序,改变
7、指针的连接关系排序,改变指针的连接关系*/ printf(n); for (i=0;im;i+) /* 输出排序结果输出排序结果*/ printf(%8s,bnamei);7void sort(char *name, int n) /*选择排序选择排序*/char *t; int i,j,k; /* k记录每趟最小值下标记录每趟最小值下标 */ for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; /* 第第j个元素更小个元素更小*/ if (k!=i) /* 最小元素是该趟的第一个元素最小元素是该趟的第一个元素 则不需交换则不需交换 */ t=namei;na
8、mei=namek;namek=t; 输出结果为:输出结果为: BASIC Programming in ANSI C TRUBO C 2.0 Visual C+ 6.0 Programming 8注意:注意: (1)字符数组中每个元素可存放一个字符,而字符指针变量字符数组中每个元素可存放一个字符,而字符指针变量存放字符串首地址,而不是存放在字符指针变量中。存放字符串首地址,而不是存放在字符指针变量中。 (2)对字符数组,与普通数组一样,不能对其进行整体赋值,对字符数组,与普通数组一样,不能对其进行整体赋值,只能给各个元素赋值,而字符指针变量可以直接用字符串常量只能给各个元素赋值,而字符指针变
9、量可以直接用字符串常量赋值。例如,若有如下定义:赋值。例如,若有如下定义: char a10; char *p;则语句则语句 a=”computer”;是非法的。是非法的。只能对各个元素分别赋值:只能对各个元素分别赋值: a0=c;a1=o;a2=m;a3=p;a7=r;但语句但语句: p=”computer”; 是合法的。是合法的。 9前面前面namename是指针数组,元素均是指针数据,可定义一指针是指针数组,元素均是指针数据,可定义一指针变量,指向数组,对数组各元素操作。变量,指向数组,对数组各元素操作。如:如: char char * *name4, name4, * * *p; p;
10、 p=name; p=name;又如:又如:p=name+2;p=name+2; printf(“%d, %d, %s”,p, printf(“%d, %d, %s”,p,* *p,p,* * *p);p);输出:输出:2004, 3016, Great wall2004, 3016, Great wall200030162004例、使用指向指针的指针。例、使用指向指针的指针。 main()char *name=“Follow me”,“BASIC”, “Great Wall”,“FORTRAN”,“Computer Design; char *p; int i; for(i=0;i5;i+)
11、 p=name+i; printf(“%sn,*p); 11指针数组的元素也可以不指向字符串,而指向整型数据指针数组的元素也可以不指向字符串,而指向整型数据或实型数据,例如:或实型数据,例如: int a5=1,3,5,7,9;int a5=1,3,5,7,9; int int * *num5=&0,&1,&2,&3,&4;num5=&0,&1,&2,&3,&4; int int * * *p;p; 此时为了得到数据此时为了得到数据5 5,可以先使,可以先使p=num+2, p=num+2, 然后输出然后输出* *
12、 *p p。* *p p是是p p间接指向的对象的地址。而间接指向的对象的地址。而* * *p p是是p p间接指向的对象间接指向的对象的值。如图:的值。如图:例例2 2 一个指针数组的元素指向整型数据的简单例子。一个指针数组的元素指向整型数据的简单例子。 main()main() static int a5=static int a5=1 1,3 3,5 5,7 7,9 9; ; int int * *num5=num5=&a0,&a1,&a2,&a3,&a4&a0,&a1,&a2,&a3,&a4; ; int
13、int* * *p p,i;i; p=num; p=num; for(i=0;ifor(i=0;i5;i+)5;i+) printf(%dtprintf(%dt,* * *p);p+;p);p+;在以往的程序中,主函数在以往的程序中,主函数main()main()都使用其无参形式。实都使用其无参形式。实际上,主函数际上,主函数main()main()也是可以指定形参的。也是可以指定形参的。 例例 用同一程序实现文件的加密和解密。约定:程序的用同一程序实现文件的加密和解密。约定:程序的可执行文件名为可执行文件名为lock.exelock.exe, 其用法为:其用法为:lock +|- lock
14、+|- ,其中,其中“+”+”为加密,为加密,“-”-”为解密。为解密。二、指针数组作二、指针数组作main函数的形参函数的形参14main(int argc, char *argv) char c; if (argc != 3) printf(参数个数不对!参数个数不对!n); else c=*argv1;/*截取第二个实参字符串的第一个字符截取第二个实参字符串的第一个字符*/ switch(c) case +: /*执行加密执行加密*/ printf(执行加密程序段。执行加密程序段。n); break; case -: /*执行解密执行解密*/ printf(执行解密程序段。执行解密程序段
15、。n); break; default: printf(第二个参数错误!第二个参数错误!n); 151.主函数主函数main()的有参形式的有参形式 main(int argc, char *argv) 2.实参的来源实参的来源运行带形参的主函数,必须在操作系统状态下,输入主函数所运行带形参的主函数,必须在操作系统状态下,输入主函数所在的可执行文件名,以及所需的实参,然后回车即可。在的可执行文件名,以及所需的实参,然后回车即可。命令行的一般格式为:命令行的一般格式为: 可执行文件名可执行文件名实参实参 实参实参2例如,本例程序的用法:例如,本例程序的用法:lock +|- 在在TC的集成环境下
16、,也可直接利用的集成环境下,也可直接利用Options | Arguments 项,项,输入主函数所需要的实参:只须输入各参数(相邻参数间用空输入主函数所需要的实参:只须输入各参数(相邻参数间用空格分开),可执行文件名可省略。格分开),可执行文件名可省略。就本案例而言,输入就本案例而言,输入“+|- ”即可。即可。163.形参说明形参说明(1)形参)形参argc是命令行中参数的个数(可执行文件名本是命令行中参数的个数(可执行文件名本身也算一个)。身也算一个)。在本例中,形参在本例中,形参argc的值为的值为3(lock、+|-、文件名)。、文件名)。(2)形参)形参argv是一个字符指针数组,
17、即形参是一个字符指针数组,即形参argv首先是首先是一个数组(元素个数为形参一个数组(元素个数为形参argc的值),其元素值都是指向实的值),其元素值都是指向实参字符串的指针。参字符串的指针。在本例中,元素在本例中,元素argv0指向第指向第1个实参字符串个实参字符串“lock”,元,元素素argv1 指向第指向第2个实参字符串个实参字符串“+|-”,元素,元素argv2指向第指向第3个实参字符串个实参字符串“被处理的文件名被处理的文件名”。17考察参数回送命令考察参数回送命令echoecho的内容,文件名为的内容,文件名为 echo.c echo.cmain(argc,argv)main(a
18、rgc,argv)int argc; char int argc; char * *argv ;argv ;while(-argc0)while(-argc0) printf(“%s%c”, printf(“%s%c”,* *+argv, (argc1)? : n);+argv, (argc1)? : n); 运行,若输入:运行,若输入: echo Computer and C Language echo Computer and C Language 回车回车则显示:则显示: Computer and C Language Computer and C Language 三、有关指针运算的小
19、结三、有关指针运算的小结定义含义int i;int *p;int an;int *pn;int (*p)n;int f();int *p();int (*p)();int *p;定义整型变量ip为指向整型数据的指针变量定义含n个元素的整型数组an个指向整型数据的指针变量组成的指针数组pp为指向含n个元素的一维整型数组的指针变量f为返回整型数的函数p为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量1、指针的数据类型、指针的数据类型19 2、指针运算小结、指针运算小结 1、指针变量加减一个整数、指针变量加减一个整数 如:
20、如:p+ p- p+i p-i p+=i p-=i 等等 实际含义如实际含义如 p+i 代表地址计算:代表地址计算: p+c*i , c为字节为字节 数,整型数,整型c=2、实型、实型c=4、字符型、字符型c=1。 2、指针变量赋值、指针变量赋值 如:如:p=&a a为变量,为变量,p为指针变量为指针变量 p=array array为数组名为数组名 p=&arrayi p=max max为函数名为函数名 p1=p2 p2为指针变量为指针变量注意:不能把一个整数或常数赋给注意:不能把一个整数或常数赋给p,如,如p=1000 同样也不能把同样也不能把p赋给整型变量,如赋给整型变量,如i=p20 3、指针变量可以赋空值、指针变量可以赋空值如: p=NULL; 实际NULL是整数0。 4、两个指针变量可以相减、两个指针变量可以相减 如两个指针变量指向同一个数组的元素(如右图),则 p2-p1=4-1=3但p1+p2无意义。 5、两个指针变量比较、两个指针变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子气体深度研究报告
- 私人文秘合同(2篇)
- 设备招标合同
- 2024中外合资经营企业合同样板
- 进口白糖的货物买卖合同(2篇)
- 电子密码锁键盘课程设计
- 塑形镜的护理与摘戴
- 电子售货机课程设计
- 电子与线路课程设计
- 电商高级培训课程设计
- 中班游戏教案坐传球
- 桑树种植行业分析
- 云计算与人工智能的协同应用
- 篮球专业职业生涯规划与管理
- GB 43472-2023灯具及灯具用电源导轨系统安全要求
- 读整本书阅读教学设计
- 婚姻法结婚的基本条件和程序
- 四川大学外国语学院《918英语专业综合知识》历年考研真题汇编(含部分答案)
- 课堂评价:促进学生的学习和发展
- 小儿败血症护理查房
- 2023年电大行政组织学试卷期末考试试题及答案
评论
0/150
提交评论