C语言第一到十四章B.ppt
C 语 言 程 序 设 计1C C 程程 序序设设计计语语言言 第第 1 1章章 C C 语言概述语言概述 第第 2 2章章 算法算法 第第 3 3章章 数据类型、运算符与表达式数据类型、运算符与表达式 第第 4 4章章 最简单的最简单的C C程序设计程序设计顺序程序设计顺序程序设计 第第 5 5章章 选择结构程序设计选择结构程序设计 第第 6 6章章 循环控制循环控制 第第 7 7章章 数组数组 第第 8 8章章 函数函数 第第 9 9章章 指针指针 第第1010章章 结构体与共用体结构体与共用体 第第1111章章 文件文件 第第1212章章 预处理命令预处理命令 第第1313章章 位操作位操作 第第1414章章 总结总结C 程序设计语言 回顾软件工程 07级2007年12月5日C 语 言 程 序 设 计2第第1章章 C语言概述语言概述计算机科学:信息在计算机内使用数据来表示,研究信息表示 和信息处理。数据:是用以描述客观事物的数值、字符,以及一切可以输入到 计算机中并由计算机程序加以处理的符号的集合。数据的基本单位称为数据元素 数据的最小单位称为数据项问题 数学模型 算法 程序 测试 计算计算机解题过程C 语 言 程 序 设 计3 程序设计语言程序设计语言 高级语言程序调试过程高级语言程序调试过程机器语言 符号语言 汇编语言 高级语言源程序 目标程序编 译连 接filename.cfilename.cppfilename.exefilename.dllfilename.objC 语 言 程 序 设 计4开开 始始编编 辑辑编编 译译连连 接接执执 行行有有 错错?结果结果正确正确结结 束束源程序f.c目标程序f.obj库函数其它目标程序可执行程序f.exe有有不正确不正确无无正确正确图图1.1库函数其它目标程序F1n.objC 语 言 程 序 设 计5C语言特点语言特点 1、语言简洁、紧凑,使用方便灵活 2、运算符丰富运算符丰富 3、数据结构丰富,具有现代化语言的各总数据结构 4、具有结构化的控制语句 5、语法限制不太严格,程序设计自由度大语法限制不太严格,程序设计自由度大 6、C语言允许直接访问物理地址,能进行位操作语言允许直接访问物理地址,能进行位操作 可实现汇编语言的大部分功能可实现汇编语言的大部分功能 7、生成目标代码的质量高,程序执行效率高 8、程序可执行性好C 语 言 程 序 设 计6C语言程序结构语言程序结构1.C程序是由函数构成的。一个C源程序至少包含一个主函数(main或主程序)和若干个其它函数(子函数或子程序)2.一个函数由两部分程序组成:说明部分和函数体3.一个C程序总是从main函数开始执行,不论main函数放在程序中的什么位置。程序的流程是通过主函数main调用其它子函数,或子函数间的相互调用4.C程序书写格式自由,一行内可以写多条语句,但每一语句必须用分号(“;”)结束5.C语言本身没有输入/输出语句,而是用函数完成相应操作6.可以用/*,*/在程序的任何部分做注释C 语 言 程 序 设 计7算法(算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令(规则)的 有限序列,其中每一条指令表示一个或多个操作。“好好”的算法的标准的算法的标准 正确性,算法能满足具体问题的需求 可读性,首先方便阅读与交流,其次才是机器执行 健壮性,输入错误时,能作出反应,避免异常出错 效率与低存储量要求算法的特征算法的特征 有穷性、确定性、输入、输出、有效性第第2章章 算法算法 AlgorithmC 语 言 程 序 设 计8对算法对算法“正确性正确性”的要求的要求 不含语法错误;对于几组输入数据能得到满足要求的结果;对精心选择苛刻并带有刁难的数据能得到满足要求的结果;对于一切合法的输入均得到满足要求的结果;算法描述算法描述 自然语言;程序设计语言;类语言*;流程图N.Wirth:Programming=Algorithm +Data Structure 程序设计 =算法 +数据结构C 语 言 程 序 设 计9问题总是先于算法问题总是先于算法程序设计的四个里程碑程序设计的四个里程碑 子程序、高级语言、结构程序设计、面向对象(OOP)结构程序设计结构程序设计 限制使用GO TO语句(基于三种基本结构)逐步求精的设计方法 自顶向下的设计、编码与调试 主程序员组的组织形式问题解决问题的算法实现算法的程序C 语 言 程 序 设 计10三种基本结构ABpABAP顺序结构顺序结构选择结构选择结构循环结构循环结构PA成立成立PA不成立不成立C 语 言 程 序 设 计11常量常量符号常量#define PRICE 30#define PI 3.1415926#define MAX 1000Total=num*PRICE;Area=PI*R*R;Int xMAX;变量变量变量名 变量名命名规则变量是有类型的数据类型数据类型:变量的取值范围和所允许操作的集合第第3章章 数据类型、运算符与表达式数据类型、运算符与表达式3a变量名变量值存储单元C 语 言 程 序 设 计12变量的存储类型变量的存储类型 变量的数据类型变量的数据类型 变量名变量名变量说明:先定义,后引用变量说明:先定义,后引用标识符命名规则intfloatcharPointer to arraystructautostaticregisterextern变量的:有效范围作用时间变量的:取值范围操作C 语 言 程 序 设 计13数据类型数据类型基本类型基本类型构造类型构造类型指针类型指针类型空空 类类 型型整形整形int字符型字符型char实型(浮点型)实型(浮点型)float枚举类型枚举类型数组数组array结构体结构体struct共用体共用体uninIntLong int Short int Unsigned int Unsigned short intUnsigned long int 注意:每种类型数据的取值范围注意:每种类型数据的取值范围Int :-2bits-1 (2bits-1-1)Unsigned :0 (2bits-1)Float :10-38 1038Double :10-308 10308C 语 言 程 序 设 计14运算符运算符0、赋值运算:、赋值运算:=1、算术运算符:、算术运算符:+*/%2、关系运算符:、关系运算符:=!=3、逻辑运算符:、逻辑运算符:!&|4、位运算符:、位运算符:-|&5、赋值运算符:、赋值运算符:=+=*=/=6、条件运算符:、条件运算符:?:7、逗号运算符:、逗号运算符:,8、指针运算符:、指针运算符:*&9、求字节数运算符:、求字节数运算符:sizeof10、强制类型转换:、强制类型转换:(类型类型)11、分量运算符、分量运算符:.-12、下标运算符:、下标运算符:13、其他、其他:()优先级优先级类型转换类型转换C 语 言 程 序 设 计15表达式表达式算术表达式:算术表达式:算术运算符算术运算符关系表达式:关系表达式:关系运算符关系运算符逻辑表达式;逻辑表达式;逻辑运算符逻辑运算符赋值表达式:赋值表达式:变量变量=表达式表达式逗号表达式:逗号表达式:表达式表达式1,表达式表达式2,表达式表达式n条件表达式:条件表达式:表达式表达式1?表达式?表达式2:表达式:表达式3混合运算混合运算doublelongunsignedint低高floatChar,shortC 语 言 程 序 设 计16第第4章章 最简单的最简单的C程序设计程序设计顺序程序设计顺序程序设计C程序源程序文件1源程序文件2源程序文件3预处理命令全局变量声明函数1函数n函数首部函 数 体局部变量声明执行语句C 语 言 程 序 设 计17C语句语句1、控制语句 if()else for()while()dowhile()continue break switch goto return2、函数调用3、表达式语句4、空语句5、复合语句赋值语句赋值语句C 语 言 程 序 设 计18输入输入/输出语句综述输出语句综述输入:从键盘或文件键入或读入数据,输入:从键盘或文件键入或读入数据,并将数据赋给程序中的变量。并将数据赋给程序中的变量。输出:将程序中变量的值显示在显示器上,输出:将程序中变量的值显示在显示器上,或写入到文件中,或在打印机上打印。或写入到文件中,或在打印机上打印。C 语 言 程 序 设 计19C语言中的输入语言中的输入/输出输出1、字符输入/输出 putchar(chr)chr=getchar()文件的字符输入/输出 fputc(chr,fp)chr=fgetc(fp)2、字符串输入/输出 puts(str)gets(str)文件的字符串输入/输出 fputs(strr,fp)fgets(str,n,fp)C 语 言 程 序 设 计203、格式输入/输出 printf(格式控制,输出表列)scanf(格式控制,地址表列)文件的格式输入/输出 fprintf(文件变量,格式控制,输出表列)fscanf(文件变量,格式控制,地址表列)Printf(“Format”,表达式1,表达式2,)Scanf(“Format”,&变量名1,&变量名2,)格式控制格式控制(Format)整 形 int%d%-nd%-m.nd实 型 float%f%-m.nf字符型 char%c%-nc字符串 char c1MAX%s%-nsC 语 言 程 序 设 计214、块数据的输入/输出 fread(buffer,size,count,fp)fwrite(buffer,size,count,fp)Char str20;Char str20;sprintf(str,sprintf(str,格式控制,变量列表格式控制,变量列表););Turbo C 函数C 语 言 程 序 设 计22系统自动打开和关闭三个系统自动打开和关闭三个标准文件标准文件标准输入标准输入-键盘键盘 stdinstdin标准输出标准输出-显示器显示器 stdoutstdout标准出错输出标准出错输出-显示器显示器 stderrstderrfpringtf(stdout,“x=%d,y=%fn”,x,y);pringtf(“x=%d,y=%fn”,x,y);C 语 言 程 序 设 计23第第5章章 选择结构程序设计选择结构程序设计算术运算 关系运算 逻辑运算 逻辑常量例:a&b&ca|b|c当a=1,b=2,c=3,d=4时 (m=ab)&(n=cd)执行后m、n=?(m=ad)执行后m、n=?ab!a!ba&ba|b真真假假真假真假假假真真假真假真真假假假真真真假ab!a!ba&ba|b110010100011010110001110真值表真值表C 语 言 程 序 设 计24条件语句:条件语句:三种格式:if()if()else else if条件表达式:表达式1?表达式2:表达式3条件运算:变量=表达式1?表达式2:表达式3SwitchC 语 言 程 序 设 计25第第6章章 循环控制循环控制循环类型:“当”型 “直到”型 计数while()dowhile()for(表达式1;表达式2;表达式3)Break:结束循环Continue:结束本次循环,进入下一次循环用流程图表示各种循环结构用流程图表示各种循环结构C 语 言 程 序 设 计26表达式1表达式2下一条语句假真真假break表达式1表达式2下一条语句假真真假continueC 语 言 程 序 设 计27第第7章章 数数 组组一维数组二维数组数组下标变量维数数组名数组名 数组类型数组类型 元素个数元素个数 下标范围下标范围先定义后使用原则先定义后使用原则数组的内存存储结构数组的内存存储结构数组长度初始化初始化数组与指针数组与指针地址常量相同类型元素组成的集合相同类型元素组成的集合C 语 言 程 序 设 计28概述函数分类函数结构函数的参数和函数的值函数的调用被调用函数的声明和函数原型函数的嵌套调用函数的递归调用函数与数组存储类型函数的指针和指向函数的指针变量简介指针数组与主函数main()的形参第第 8章章 函数函数 C 语 言 程 序 设 计29C程序是由函数构成的!程序是由函数构成的!C程序程序源程序文件源程序文件1源程序文件源程序文件2源程序文件源程序文件3预处理命令预处理命令全局变量声明全局变量声明函数函数1函数函数n函数首部函数首部函函 数数 体体局部变量局部变量声明声明执行语句执行语句C 语 言 程 序 设 计30函数分类1:定义的角度看,函数可分为 库函数库函数和用户定义函数用户定义函数函数分类函数分类函数分类2:从调用角度,可分为 有返回值函数有返回值函数和无返回值函数无返回值函数函数分类3:参数传递角度,可分为 无参函数无参函数和有参函数有参函数函数分类4:从功能功能角度,可分为:字符串、字符串、转换、目录路径、诊断图形转换、目录路径、诊断图形I/O函数、接口、内存管理、日期和时函数、接口、内存管理、日期和时间、数学、进程等间、数学、进程等C 语 言 程 序 设 计31 存储类型存储类型 返值类型返值类型 函数名函数名(形式参数表列形式参数表列)声明部分声明部分(局部变量说明局部变量说明)语句部分(完成函数的功能)语句部分(完成函数的功能)exit(0)return;/return();/return()/return 函数的结构函数的结构autostaticregisterexternInt,float,charPointer to Structvoid类型变量指针数组结构体函数C 语 言 程 序 设 计32存储类型存储类型 返值类型返值类型 函数名函数名(形式参数表列形式参数表列)标识符命名规则intfloatcharpointerarrayStructvoidautostaticregisterextern变量的:有效范围作用时间变量的:取值范围操作 类型变量 指针变量 数组 结构体 函数C 语 言 程 序 设 计33函数的调用函数的调用 函数调用的一般形式函数调用的一般形式 函函数数名名(实实际际参参数数表表);函数表达式函数表达式 例如:z=max(x,y)函数语句函数语句 例如:printf(%d,a);scanf(%d,&b);函数实参函数实参 例如:printf(“%d”,max(x,y);常量 表达式 数组元素 类型变量 指针变量 数组 结构体 函数C 语 言 程 序 设 计34被调用函数的声明和函数原型被调用函数的声明和函数原型 其一般形式为:其一般形式为:类型说明符类型说明符 被调函数名被调函数名(类型类型 形参,类型形参,类型 形参形参);或为:或为:类型说明符类型说明符 被调函数名被调函数名(类型,类型类型,类型);原则:原则:先声明,后使用 函数的嵌套调用函数的嵌套调用函数的递归调用函数的递归调用直接递归直接递归和和间接递归间接递归C 语 言 程 序 设 计35关于函数的处理结果:关于函数的处理结果:无数据返回无数据返回单值返回单值返回多值返回多值返回批量数据返回批量数据返回 调用函数调用函数被调用函数被调用函数结果结果C 语 言 程 序 设 计36数组作为函数参数数组作为函数参数 数组元素作为函数实在参数,形参为变量 数组名作为函数参数(指针),形参为指针,但应同 时传送数组的长度例:float average(float array10,int n)float average(float array,int n)float average(float *array,int n)指针变量作为函数参数指针变量作为函数参数C 语 言 程 序 设 计37存储类型存储类型变量的数据类型:变量的取值范围和允许的操作变量的存储类型:变量的有效时间和作用范围变量的存在时间变量的存在时间(1)全局变量(全局变量(global varible)定义在所有函数体之外的变量。定义位置:在程序中所有函数体之外;有效范围:在定义开始之后的所有函数中;使用要求:不能与局部变量重名;存在时间:从程序开始到程序结束。(2)局部变量(局部变量(local varible)定义在所函数体内的变量。定义位置:在某一函数体内定义;有效范围:只在定义变量的函数中有效;存在时间:函数调用时产生,函数结束后消失 使用特点:局部变量的存在时间决定了不同函数中的局部变量 是互不干涉的,即使同名,也完全相互独立。(3 3)外部变量()外部变量(Extern varibleExtern varible)C 语 言 程 序 设 计38变量的存储类型:变量的存储类型:auto static register extern1、自动存储类型、自动存储类型(auto)2、寄存器存储类型、寄存器存储类型(register)3、静态存储类型、静态存储类型(static)4、外部存储类型、外部存储类型(extern)性能性能自动变量自动变量(局部变量)(局部变量)外部变量外部变量(全局变量)(全局变量)静态变量静态变量寄存器变量寄存器变量外部外部内部内部生存期生存期与函数相同与函数相同与程序相同与程序相同程序程序程序程序函数函数多函数共享多函数共享否否可可可可否否否否多文件共享多文件共享否否可可否否否否否否定义式自动初始化定义式自动初始化否否000否否作用域作用域当前函数当前函数整个程序整个程序当前程序当前程序当前函数当前函数当前函数当前函数存储变量的特征存储变量的特征C 语 言 程 序 设 计39从作用于角度,分为局部变量和全局变量。从作用于角度,分为局部变量和全局变量。变量的作用域变量的作用域 存在时间存在时间 动态存储动态存储 静态存储静态存储静态存储:静态存储:静态局部变量(函数内有效)静态局部变量(函数内有效)静态外部变量(本文件内有效)静态外部变量(本文件内有效)外部变量(其它文件可引用)外部变量(其它文件可引用)动态存储:动态存储:自动变量(本函数内有效)自动变量(本函数内有效)寄存器变量(本函数内有效)寄存器变量(本函数内有效)形式参数(本函数内有效)形式参数(本函数内有效)全局变量:全局变量:静态外部变量(只限于本文件使用)静态外部变量(只限于本文件使用)外部变量(非静态的外部变量,允许其它文件使用)外部变量(非静态的外部变量,允许其它文件使用)局部变量:局部变量:自动变量,即动态局部变量(离开函数,值即消失)自动变量,即动态局部变量(离开函数,值即消失)静态局部变量(离开函数,值仍保留)静态局部变量(离开函数,值仍保留)寄存器变量(离开函数,值即消失)寄存器变量(离开函数,值即消失)(形式参数可定义为自动变量和寄存器变量)(形式参数可定义为自动变量和寄存器变量)C 语 言 程 序 设 计40关于作用域和生存期的概念:关于作用域和生存期的概念:从前面叙述可以知道,对一个变量的性质可以从两个方面分析,从前面叙述可以知道,对一个变量的性质可以从两个方面分析,一是从变量的一是从变量的作用域作用域,一是从变量值存在时间的长短,即,一是从变量值存在时间的长短,即生存期生存期。作用域作用域:空间的角度:空间的角度生存期生存期:时间的角度:时间的角度 如果一个变量在某个文件或函数范围内是有效的,则称该文件或如果一个变量在某个文件或函数范围内是有效的,则称该文件或函数为该变量的作用域,在此作用域内可以引用该变量,所以又称变函数为该变量的作用域,在此作用域内可以引用该变量,所以又称变量在此作用域内量在此作用域内“可见可见”,这种性质又称为变量的,这种性质又称为变量的“可见性可见性”。如果一个变量值如果一个变量值i i在某一时刻是存在的,则认为这一时刻属于该变在某一时刻是存在的,则认为这一时刻属于该变量的量的“生存期生存期”,或称该变量在此时刻,或称该变量在此时刻“存在存在”。C 语 言 程 序 设 计41内部函数与外部函数内部函数与外部函数内部函数:一个函数只能被定义它的文件内的其它函数调用。定义函数时加 static static 类型说明类型说明 函数名(形参表)函数名(形参表)外部函数:一个函数可以被其它文件内的函数调用。定义函数时加 extern extern 类型说明类型说明 函数名(形参表)函数名(形参表)函数定义的完整格式:存储类型存储类型 返回值数据类型返回值数据类型 函数名(形参表)函数名(形参表)使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。C 语 言 程 序 设 计42函数的指针和指向函数的指针变量简介函数的指针和指向函数的指针变量简介1、函数指针的概念 一个函数在编译时,被分配了一个入口地址,这个地址就称为该函数的指针。可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。2、指向函数的指针变量 (1)定义格式 函数返值类型函数返值类型 (*(*指针变量指针变量)()();注意注意:“*指针变量”外的括号不能缺,否则成了返回指针值的函数。例如,int(*fp)();/*fp为指向int函数的指针变量*/(2)赋值 函数名代表该函数的入口地址。可用函数名给指向函数的指针变量赋值。指向函数的指针变量指向函数的指针变量&函数名函数名;注意注意:函数名后不能带括号和参数;函数名前的“&”符号是可选的。(3)调用格式 (*(*函数指针变量函数指针变量)()(实参表实参表)3、指向函数的指针变量作函数参数 指向函数的指针变量的常用用途之一,就是将函数指针作参数,传递到其它函 数。函数名作实参时,因为要缺省括号和参数,造成编译器无法判断它是一个 变量还是一个函数,函数说明的格式与其他函数一样。注意注意:对指向函数的指针变量,诸如p+i、p+/p-等运算是没有意义的。C 语 言 程 序 设 计43第第 9章章 指针指针n指针的概念指针的概念n变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量n数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量n字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量n函数的指针和指向函数的指针变量函数的指针和指向函数的指针变量n返回指针值的函数返回指针值的函数n指针数组和指向指针的指针指针数组和指向指针的指针n指针型数据小结指针型数据小结C 语 言 程 序 设 计44指针的概念指针的概念指针就是地址。指针就是地址。有变量的、数组的、函数的、字符串的指针等。有变量的、数组的、函数的、字符串的指针等。1 1、内存的访问方式、内存的访问方式 1)1)直接访问直接访问 2)2)间接访问间接访问2 2、指针的概念、指针的概念 一个变量的地址称为该变量的一个变量的地址称为该变量的“指针指针”。存放地址的变量叫存放地址的变量叫“指针变量指针变量”。换句话说,指针变量。换句话说,指针变量存放地址。存放地址。C 语 言 程 序 设 计45变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量1 1、指针变量的定义、指针变量的定义 一般形式:一般形式:类型标识符类型标识符 *变量名;变量名;2 2、指针变量的引用、指针变量的引用 1)给指针变量赋值 赋变量的地址 2)2)用指针变量对变量赋值用指针变量对变量赋值3 3、指针运算、指针运算C 语 言 程 序 设 计46重点:指向数组元素的指针变量及其应用重点:指向数组元素的指针变量及其应用 指向多维数组元素的指针变量及其应用指向多维数组元素的指针变量及其应用 指向一维数组的指针变量及其应用指向一维数组的指针变量及其应用难点:多维数组的指针变量及其应用难点:多维数组的指针变量及其应用数组的指针是数组的起始地址,数组元素的指针是元素数组的指针是数组的起始地址,数组元素的指针是元素的地址。的地址。引用数组可以用下标法,也可以用指针法,通过指向数引用数组可以用下标法,也可以用指针法,通过指向数组的元素的指针找到数组元素。组的元素的指针找到数组元素。使用指针法能使目标程序占内存少,运行速度快。使用指针法能使目标程序占内存少,运行速度快。数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量C 语 言 程 序 设 计471.概念概念 数组的指针数组的指针数组在内存中的起始地址,数组元素的指针数组在内存中的起始地址,数组元素的指针数组数组 元素在内存中的起始地址。元素在内存中的起始地址。2.指向数组的指针变量的定义指向数组的指针变量的定义 指向数组的指针变量的定义,与指向普通变量的指针变量的定义方法一样。指向数组的指针变量的定义,与指向普通变量的指针变量的定义方法一样。例如,例如,int array10,*pointer=array(或或&array0);或者:或者:int array10,*pointer;pointerarray;注意:数组名代表数组在内存中的起始地址注意:数组名代表数组在内存中的起始地址,所以可以用数组名给指针变量赋所以可以用数组名给指针变量赋值。值。3.数组元素的引用数组元素的引用 数组元素的引用,既可用下标法,也可用指针法。使用下标法,直观;而数组元素的引用,既可用下标法,也可用指针法。使用下标法,直观;而 使用指针法,能使目标程序占用内存少、运行速度快。使用指针法,能使目标程序占用内存少、运行速度快。C 语 言 程 序 设 计481 1、指向数组元素的指针变量的定义与赋值、指向数组元素的指针变量的定义与赋值2 2、通过指针引用数组元素、通过指针引用数组元素 3 3、数组名作函数参数、数组名作函数参数指针变量作函数参数(形参)指针变量作函数参数(形参)形参和实参均数组形参和实参均数组 形参用数组而实参用指针形参用数组而实参用指针形参用指针而实参用数组形参用指针而实参用数组 形参和实参均用指针形参和实参均用指针传递的均是数组的首地址。传递的均是数组的首地址。C 语 言 程 序 设 计49第第i i行、第行、第j j列的元素表示方法:列的元素表示方法:(1 1)下标法:)下标法:aijaij (2 2)用)用 ai+j ai+j 地址表示:地址表示:*(ai+j ai+j)(3 3)用)用*(a+i)+j*(a+i)+j 地址表示:地址表示:*(*(a+i)+j)*(*(a+i)+j)地址表示方法汇总:地址表示方法汇总:表示形式表示形式含义含义地址地址a二维数组名,数组首地址二维数组名,数组首地址2000a0,*(a+0),*a第第 0行第行第0列元素地址列元素地址2000a-1第第1行首地址行首地址2008a1,*(a+1)第第1行第行第0列元素地址列元素地址2008a1+2,*(a+1)+2,&a12第第1行第行第2列元素地址列元素地址2012*(a1+2),*(*(a+1)+2),a12第第1行第行第2列元素的值列元素的值元素值为元素值为13C 语 言 程 序 设 计50 变量的指针只能存放变量的地址,而不能存放数组的地址,变量的指针只能存放变量的地址,而不能存放数组的地址,可定义数组的指针变量来存放数组的地址。可定义数组的指针变量来存放数组的地址。定义的一般形式:定义的一般形式:类型说明符类型说明符 (*(*指针变量指针变量)数组长度数组长度;如:如:int (*p)4 int (*p)4 p p为一指向具有为一指向具有4 4个整型元素的一维数组的指针变量个整型元素的一维数组的指针变量 (不能写成(不能写成*p4,*p4,此为指针数组)此为指针数组)二维数组的指针及其指针变量:二维数组的指针及其指针变量:C 语 言 程 序 设 计51实参是地址或指针;形参有两种形式:实参是地址或指针;形参有两种形式:(1)用指向变量的指针变量,)用指向变量的指针变量,(2)用指向一维数组的指针变量。)用指向一维数组的指针变量。多维数组的指针作为函数参数多维数组的指针作为函数参数C 语 言 程 序 设 计52 数组名作形参时,接收实参数组的起始地址;作实参时,数组名作形参时,接收实参数组的起始地址;作实参时,将数组的起始地址传递给形参数组。将数组的起始地址传递给形参数组。引入指向数组的指针变量后,数组及指向数组的指针变引入指向数组的指针变量后,数组及指向数组的指针变量作函数参数时,可有种等价形式(本质上是一种,即指量作函数参数时,可有种等价形式(本质上是一种,即指针数据作函数参数):针数据作函数参数):(1 1)形参、实参都用数组名)形参、实参都用数组名(2 2)形参、实参都用指针变量)形参、实参都用指针变量(3 3)形参用指针变量、实参用数组名)形参用指针变量、实参用数组名(4 4)形参用数组名、实参用指针变量)形参用数组名、实参用指针变量C 语 言 程 序 设 计53二维数组指针作函数参数二维数组指针作函数参数 二维数组的指针作函数实参时,有列指针和行指针两种形式。二维数组的指针作函数实参时,有列指针和行指针两种形式。相应的,用来接受实参数组指针的形参,必须使用相应形式的相应的,用来接受实参数组指针的形参,必须使用相应形式的指针变量,如下所示:指针变量,如下所示:实参:实参:列指针列指针 行指针行指针 形参:形参:(列)指针变量(列)指针变量 行指针变量行指针变量C 语 言 程 序 设 计54字符串的指针和指向字符串的指针变量重点:重点:(1)字符串指针的定义、)字符串指针的定义、引用及作函数参数;引用及作函数参数;(2)字符串指针变量与)字符串指针变量与 字符数组的区别。字符数组的区别。1、字符串的表示形式、字符串的表示形式 1)用字符数组)用字符数组 char a 10=“CHINA”2)用字符指针)用字符指针 char *string=“I love China!”;IString0IString1lString2loString3ovString4veString5eString6CString7ChString8hiString9inString10naString11a!String12!0String130stringstringC 语 言 程 序 设 计55字符串指针作函数参数:字符串指针作函数参数:参数是字符串或字符串指针,传递的是地址。在被参数是字符串或字符串指针,传递的是地址。在被调函数中改变后,可在主调函数中得到改变后的数据。调函数中改变后,可在主调函数中得到改变后的数据。用数组名、指针变量作函数参数的几种组合:用数组名、指针变量作函数参数的几种组合:数组名数组名 数组名数组名 数组名数组名 字符指针变量字符指针变量 字符指针变量字符指针变量 数组名数组名 字符指针变量字符指针变量 字符指针变量字符指针变量C 语 言 程 序 设 计56 虽二者均能实现对字符串的存储和计算,但虽二者均能实现对字符串的存储和计算,但:字符数组由元素组成字符数组由元素组成,元素中放字符;字符指针变量放地址(如字符串,元素中放字符;字符指针变量放地址(如字符串的首地址等);的首地址等);赋初值的方式不同赋初值的方式不同;对字符数组赋初值一般用;对字符数组赋初值一般用static,static,如如 static char str=“I love China!”;而字符指针变量赋初值一般不用而字符指针变量赋初值一般不用staticstatic,如:,如:char *p=“I love China!”;赋值方式不同;赋值方式不同;对字符数组要么赋初值(即定义时赋值),要么对元素赋值,下面对字符数组要么赋初值(即定义时赋值),要么对元素赋值,下面的赋值方式是错误的:的赋值方式是错误的:char str14;str14=“I love China!”;字符指针变量赋值一般可赋初值,或先定义后赋值,如字符指针变量赋值一般可赋初值,或先定义后赋值,如 char*a;a=“I love China!”;等价于:等价于:char*a=“I love China!”;字符指针变量与字符数组字符指针变量与字符数组C 语 言 程 序 设 计571、函数的指针及指向函数的指针变量、函数的指针及指向函数的指针变量 1)函数指针的概念函数指针的概念 一个函数在编译时被分配一个入口地址,这个入口地址称为函数的一个函数在编译时被分配一个入口地址,这个入口地址称为函数的指针。指针。2)指向函数的指针变量指向函数的指针变量 定义的一般形式:定义的一般形式:数据类型标识符数据类型标识符 (*指针变量名)()指针变量名)()重点:函数指针的概念及指向函数的指针变量重点:函数指针的概念及指向函数的指针变量 用指向函数的指针变量作函数参数用指向函数的指针变量作函数参数函数的指针和指向函数的指针变量函数的指针和指向函数的指针变量C 语 言 程 序 设 计582 2、用指向函数的指针变量作函数的参数、用指向函数的指针变量作函数的参数 传递的是函数的入口地址,一般的使用形式:传递的是函数的入口地址,一般的使用形式::sub(f1,f2);/*sub(f1,f2);/*主调函数主调函数/*/*:sub(x1,x2)sub(x1,x2)int(*x1)(),(*x2)();int(*x1)(),(*x2)();int a,b,i,j;int a,b,i,j;:/*:/*次主调函数次主调函数*/*/a=(*x1)(i);/*x1 a=(*x1)(i);/*x1、x2x2为被调函数为被调函数*/*/b=(*x2)(i,j);b=(*x2)(i,j);:f1函数f2函数f1x1f2x2C 语 言 程 序 设 计59存储类别存储类别 数据类型标识符数据类型标识符*函数名(形参表列)函数名(形参表列)形参说明形参说明 函数体函数体 如:如:int *a(x,y)/*int *a(x,y)/*存储类别为外部函数存储类别为外部函数*/*/int x,y;int x,y;2 2、指针函数的应用、指针函数的应用 返回指针值的函数返回指针值的函数1、指针函数的定义、指针函数的定义C 语 言 程 序 设 计60指针数组和指向指针的指针指针数组和指向指针的指针1 1、指针数组、指针数组 其元素均为指针型数据的数组,称为指针数组。其元素均为指针型数据的数组,称为指针数组。定义形式:定义形式:类型标识符类型标识符 *数组名数组名 数组长度说明数组长度说明 如:如:int *p4;int *p4;不能写成不能写成 int(*p)4 int(*p)4指针数组主要用于指向多个字符串,使字符串处理方便。指针数组主要用于指向多个字符串,使字符串处理方便。C 语 言 程 序 设 计612、指向指针的指针、指向指针的指针 即指向指针数据的地址。即指向指针数据的地址。定义形式:定义形式:类型标识符类型标识符 *变量名变量名 如:如:char *P;p为一个指向字符指针变量的指针变量。为一个指向字符指针变量的指针变量。一般指向一数组的首地址。一般指向一数组的首地址。如:如:char *name4,*p;p=name;Computer designname4FORTRANname3Great Wallname2BASICname1Follow mename0pname数组字符串20042000name3016C 语 言 程 序 设 计62间接访问的间接访问的“单级间址单级间址”和和“二级间址二级间址”用指针访问便是间接访问。用指针访问便是间接访问。若指针变量中存放的是目标变量的地址,称为若指针变量中存放的是目标变量的地址,称为“单级间址单级间址”,指向指针,指向指针的指针为的指针为“二级间址二级间址”。还可以有多级间址。见下图。还可以有多级间址。见下图。地址地址地址地址1值值指针变量指针变量变量变量地址地址2值值地址地址1地址地址1地址地址1指针变量指针变量1指针变量指针变量2变量变量指针变量指针变量1指针变量指针变量2变量变量地址地址1指针变量指针变量n(a)(b)(c)C 语 言 程 序 设 计631 1、有关指针的数据类型、有关指针的数据类型 定定 义义 含含 义义int i;定义整型变量定义整型变量int *p;P为指向整型数据的指针变量为指向整型数据的指针变量int an;定义整型数组定义整型数组a,它有它有n个元素个元素int*pn;定义指针数组定义指针数