




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
( The C Language Programming ),C语言程序设计,2,教学目的与要求: 掌握程序的基本结构 了解C语句概述 熟记数据的输入及输出函数的一般格式,并能编写简单的顺序结构程序。 教学手段: 多媒体课件为主,辅以黑板板书 教学内容、重点、难点及作业详见课件,3,第八章 指针,8.3 指针与数组 8.4 指针与字符串 8.5 指针数组与命令行参数 8.6 程序举例,4,8.3 指针与数组,8.3.1 指向一维数组的指针 将一个一维数组的起始地址(数组名)赋给一个指针变量,则该指针变量就是一个指向一维数组的指针。例如: int a5=1,2,3,4,5,*p; p=a; 或: p=,1,2,3,4,5,a数组,p,a0,a1,a2,a3,a4,5,若有如下定义: int a5=0,2,4,6,8,*p=a; 则a数组中第i个元素可用以下4种方法表示: (1)下标法:ai。 (2)数组名法:*(a+i)。 (3)指针法:*(p+i)。 (4)指针下标法:pi。,6,例8.7 使用不同方法输出整型数组a各元素。,main( ) int a5=1,2,3,4,5,i,*p; for(i=0;i5;i+) printf(“%4d“,ai); printf(“n“); for(i=0;i5;i+) printf(“%4d“,*(a+i); printf(“n“); for(p=a;pa+5;p+) printf(“%4d“,*p); printf(“n“); p=a; for(i=0;i5;i+) printf(“%4d“,pi); ,7,例8.8 从键盘上输入5个整数到数组a中,然后输出。,main( ) int a5,i,*p; p=a; for(i=0;i5;i+) scanf(“%d“,p+); p=a; for(i=0;i5;i+) printf(“%6d”,*(p+); /*不可(*p)+*/ printf(“n“); ,8,8.3.2 指向二维数组的指针,1. 二维数组的地址 与一维数组类似,二维数组名代表二维数组的首地址,但该地址是二级地址。 如有下面的定义: int a23=1,2,3,4,5,6; 对于第0行的元素a00,a01,a02,可以看成是一维数组a0的三个元素,即把a0看成一维数组名,这样a0即代表第0行的首地址,也是第0行第0列元素的地址:&a00。,9,因此,a0,a1 分别代表2行的首地址,而a0又可以表示为*(a+0),a1可表示为*(a+1)。因此元素aij的地址可表示为ai+j或*(a+i)+j。而元素值则表示为*(ai+j)或*(*(a+i)+j)。 例如:a02元素可表示为*(a0+2)或*(*(a+0)+2)。这就是二维数组元素的指针表示形式。由此得出二维数组元素的三种表示形式: 1、aij(下标法) 2、*(ai+j)(一维数组名法) 3、*(*(a+i)+j)(二维数组名法)。,10,二维数组的指针表示如图所示: int a34=1,2,3,4,5,6,7,8,9,10,11,12;,11,main( ) int a23=1,2,3,4,5,6,i,j,k,*p; for(i=0;i2;i+) for(j=0;j3;j+) printf(“%4d“,*(ai+j); printf(“n“); for(i=0;i2;i+) for(j=0;j3;j+) printf(“%4d“,*(*(a+i)+j); printf(“n“); p=*(a+0); for(i=0;i2;i+) for(j=0;j3;j+) printf(“%4d“,*(p+); printf(“n“); ,例8.9 :,12,2. 指向二维数组的指针变量,(1) 直接指向二维数组元素的指针变量 例8.10 找出二维数组中的最大元素,并指出其所在的位置(行列号)。 main( ) /*用数组名法实现*/ int i,j,m,n,max,a34=1,2,3,4,5,6,7,8,9,10,11,12; max=*a; /*将第一个元素值赋给max*/ for(i=0;i3;i+) for(j=0;j4;j+) if(max*(*(a+i)+j) max=*(*(a+i)+j);m=i;n=j; printf(“max is:a%d%d=%dn“,m,n,max); ,13,main( ) /*用指针法实现*/ int i,j,m,n,max,*p; int a34=1,2,3,4,5,6,7,8,9,10,11,12; p=a0; max=*p; /*将第一个元素值赋给max*/ for(i=0;i3;i+) for(j=0;j4;j+,p+) if(max*p) max=*p;m=i;n=j; printf(“max is:a%d%d=%dn“,m,n,max); ,14,(2) 指向二维数组一行的指针,指向二维数组一行的指针亦称行指针。 行指针定义形式为: 类型标识符 (*指针变量名)元素个数; 例如: int a35, (*p)5; p=a; /*或p=a+0;*/ 由于p是行指针,所以p+1不是指向数组的下一元素a01,而是指向下一行a1。,15,例8.11 用行指针实现例8.10的功能。,main( ) int i,j,m,n,max,(*p)4; int a34=1,2,3,4,5,6,7,8,9,10,11,12; p=a; max=*(*p+0); /*将第一个元素值赋给max*/ for(i=0;i3;i+,p+) for(j=0;j4;j+) if(max*(*p+j) max=*(*p+j);m=i;n=j; printf(“max is:a%d%d=%dn“,m,n,max); ,16,8.3.3 用指向数组的指针作函数参数,用数组名作参数有以下4种情况: (1)实参和形参都是数组名; (2)实参是数组名,形参是指针变量; (3)实参是指针变量,形参是数组名; (4)实参和形参都是指针变量。,17,int fun(int a ,int n) /* 形参为数组,也可为*a */ int k,sum=0; for(k=0;kn;k+) sum+=ak; /* 也可*a+ */ return(sum); main( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12,*p,total; p=a0; total=fun(p,12); /*用指针变量作实参*/ printf(“total=%dn”,total); ,例8.12 求二维数组中全部元素之和。,18,8.4 指针与字符串,8.4.1 指向字符串的指针 指向字符串的指针称为字符指针,其定义形式是: char *指针变量名; 例如: char c5=“book“,*p; p=c; 请看下列程序: main() char c=“book“,*p; p=c; printf(“%sn“,c);printf(“%sn“,p); ,19,例8.13 将字符串第n个字符开始复制到另一数组中。,#include “string.h“ main( ) int i,n; char a=“computer”,b10,*p,*q; p=a; q=b; scanf(“%d“, ,输入: 3 输出: String a:computer String b:mputer,20,8.4.2 字符指针与字符数组的区别,(1)字符数组由若干个元素组成,每个元素可以放一个字符;字符指针是一个存放地址的变量,其值可以是字符串的首地址(指向这个字符串)也可以是字符变量的地址(指向这个字符变量),字符指针的值是可以改变的。 (2)赋值方式不同。 对于字符数组c可以 char c20=“computer“; 但不可以 char c20; c=“computer“; 而对于字符指针p,既可以 char *p=“computer“; 也可以 char *p; p=“computer“;,21,用字符指针作函数的参数,也有4种情况: (1)实参形参都是字符数组名; (2) 实参是字符数组名,形参是字符指针变量; (3) 实参是字符指针变量,形参是字符数组名; (4) 实参和形参都是字符指针变量。,22,例8.14 编写一个函数str_cat(),使串s2接到串s1后。,char *str_cat(char *s1,char *s2) char *p; for(p=s1;*p!=0;p+); /*此处使用了空循环*/ while(*s2!=0) *p+=*s2+; *p=0; return(s1); main() char c110= “abc”,c2=“def”,*p; p=str_cat(c1,c2); printf(“The new string is:%sn“,p); printf(“The new string is:%sn“,c1); ,运行结果: The new string is: abcdef The new string is: abcdef,23,8.5 指针数组与命令行参数,8.5.1 指针数组 指针数组的定义形式为: 类型标识符 *数组名常量表达式; 例如: char *p3; p0= “BASIC“; p1= “PASCAL“; p2= “FORTRAN“; 或: char *p3=“BASIC“,“PASCAL“,“FORTRAN“;,24,8.5.2 指针数组与命令行参数,带形参的main()函数的一般形式是: main(int argc,char *argv) 此时其调用格式为: 可执行程序名 参数1 参数2 参数n,25,例8.16 设下列程序名为exam.c,经编译连接后生成的可执行程序为exam.exe。请分析程序执行结果。,#include “stdio.h“ main(int argc,char *argv) int i=0; printf(“argc=%dn“,argc); while(argc=1) printf(“参数%d:%sn“,i,*argv); i+; argc-; argv+; 若运行该程序时在命令行输入的是: exam BASIC PASCAL FORTRAN,运行结果: argc=4 参数0:exam 参数1:BASIC 参数2:PASCAL 参数3:FORTRAN,26,27,课堂练习,写出下面程序的运行结果: 1. void fun(int *x) printf(“%dn“,+*x); main() int a=25; fun( ,运行结果: 26,28,2、 #include “stdio.h“ main() char *ptr1,*ptr2; ptr1=ptr2=“8765“; (*ptr1)+; ptr2+; printf(“c1=%c,c2=%cn“,*ptr1,*ptr2); while(*ptr2!=0) putchar(*ptr2+); putchar(n); ,运行结果: C1=9,c2=7 765,29,3、 main() char *str=“abcde“; printf(“%cn“,*str); printf(“%cn“,*str+); printf(“%cn“,*+str); prin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025安徽六安市人民医院招聘69人考前自测高频考点模拟试题及答案详解(新)
- 2025年智能制造企业数字化转型实践
- 2025年海洋能源开发海水淡化技术创新进展
- 2025年河北地质大学选聘工作人员85人考前自测高频考点模拟试题有答案详解
- 2025广东省交通集团有限公司高速公路社会招聘349人模拟试卷附答案详解(突破训练)
- 2025广西防城港市防城区政务服务监督管理办公室招聘1人模拟试卷附答案详解
- 2025南昌铁路科技有限公司招聘高铁(普铁)设备维保技术人员模拟试卷及答案详解(考点梳理)
- 2025海南软件职业技术学院考核招聘事业编制专任教师15人模拟试卷附答案详解
- 2025广西百色市人民医院人才招聘38人(第二批)模拟试卷参考答案详解
- 2025华夏银行社会招聘模拟试卷参考答案详解
- 2024年安徽九华山旅游发展股份有限公司招聘笔试参考题库附带答案详解
- B级英语词汇表修改版
- 2024年山西省成考(专升本)大学政治考试真题含解析
- 最高法院第一巡回法庭关于行政审判法律适用若干问题的会议纪要
- 足球场的运营可行性方案
- GB/T 2881-2023工业硅
- 经济统计学课件
- 有限合伙份额质押合同完整版(包含质押登记公证手续)
- GB/T 43299-2023机动车玻璃电加热性能试验方法
- 马工程经济法学教学
- 肠道微生态与人体健康
评论
0/150
提交评论