专升本语言程序设计_第1页
专升本语言程序设计_第2页
专升本语言程序设计_第3页
专升本语言程序设计_第4页
专升本语言程序设计_第5页
已阅读5页,还剩171页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计主讲:王晓峰主讲内容:一.C语言概述二.数据类型、运算符与表达式三.顺序结构、输入输出四.选择结构五.循环结构六.数组七.函数八.指针、结构体、共用体九.文件操作注:算法和结构体指针的内容放入数据结构课程1.两个C语言的实例2.C语言的特点3.C语言的基本语法4.C语言的程序结构一、C语言概述C语言是与计算机交互的第三代高级语言,采用结构化和面向过程的特点。有过编程经验的读者最想完成的程序:HelloWorld!没有任何编程经验的读者,请考虑下面的需求实现:随机产生一百以内的加法算式4道,与用户交互,用户输入答案后进行正确错误判断,最终给出用户成绩。注:用户应该是小学一年级的学生。两个C语言实例C语言的特点1.C语言源程序由多个相互独立的函数组成2.简洁,32个关键字,9种控制语句,34个运算符3.结构化控制,语法限制不严格4.允许访问物理地址,位操作(bit)5.执行效率高C语言的基本语法成分1.C语言字符集:字符是C语言的最基本的元素,C语言字符集由字母、数字、空白、标点和特殊字符组成(在字符串常量和注释中还可以使用汉字等其它图形符号)。a).字母:A-Z,a-zb).数字:0-9c).空白符:空格,制表符(跳格),换行符(空行)的总称。d).标点符号、特殊字符:

!#%^&+-*/=~<>\|.,;:?‘“()[]{}

2.标识符标识符用来标识变量名、符号常量名、函数名、类型名、文件名等的有效字符序列。

3.关键字C语言中一些具有特殊意义的标识符称为关键字。这些关键字在任何时候都不得用作变量名、符号常量名、函数名、类型名、文件名等。5.分隔符:分号,空格。起分隔、间隔作用。6.注释符:“/*”和“*/”构成一组注释符。"//"可用于单行注释。

4.运算符:运算符将常量、变量、函数连接起来组成表达式,表示各种运算。C语言的程序结构

1.C程序全部由一个一个的函数构成。至少有一个主函数main(),其它函数可被主函数调用或相互调用。其它函数可为C函数库中函数,也可为自己编的函数。2.一个函数由两部分组成1).函数的说明部分

包括函数名、函数类型、函数属性、函数参数(形参)名、形式参数类型。2).函数体

最外层{}中的部分。由变量定义和执行语句两部分组成。3.一个C程序总是从main函数开始执行,而main函数可以出现在整个程序中的任何位置。4.C程序书写格式自由,一行内可写多个语句,一个语句可分写在多行上。5.每个语句(包括最后一个语句)和数据定义的后面必须有一个分号。6.C语言本身没有输入输出语句。输入输出操作由库函数scanf和printf等函数完成。7.可以用“/……/”在C程序中的任何地方作注释以提高程序的可读性。理解C语言的概念数据类型变量与常量标识符规则表达式语句复合语句控制流函数数组指针结构体C语言上机步骤开始编辑源程序f.c编译目标程序f.obj有错?

连接库函数和其它目标程序可执行目标程序f.exe执行正确?不正确正确结束有无二、数据类型运算符与表达式常量与变量变量:在程序运行过程中,其值可以被改变的量称为变量。变量代表内存中具有特定属性的一个存储单元,它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。常量:程序运行过程中不能被改变的量。常量的分类1)整型常量(如12、0、-3为整型常量)2)实型常量(4.6、-1.23为实型常量)3)字符常量(’a’、’d’字符常量)4)符号常量(具有含义清楚、见名知意、修改方便、一改全改的优点)。1.整型数据的分类最基本的整型类型基本整型(int型):占2个或4个字节短整型(shortint):VC++6.0中占2个字节长整型(longint):VC++6.0中占4个字节双长整型(longlongint):C99新增的整型数据扩充的整型类型:有符号基本整型[signed]int;无符号基本整型unsignedint;有符号短整型[signed]short[int];无符号短整型unsignedshort[int];有符号长整型[signed]long[int];无符号长整型unsignedlong[int];有符号双长整型[signed]longlong[int];无符号双长整型unsignedlonglong[int];1.字符与字符代码大多数系统采用ASCII字符集字母:A~Z,a~z数字:0~9专门符号:29个:!”#&‘()*等空格符:空格、水平制表符、换行等不能显示的字符:空(null)字符(以‘\0’表示)、警告(以‘\a’表示)、退格(以‘\b’表示)、回车(以‘\r’表示)等字符型数据字符’1’和整数1是不同的概念:字符’1’只是代表一个形状为’1’的符号,在需要时按原样输出,在内存中以ASCII码形式存储,占1个字节整数1是以整数存储方式(二进制补码方式)存储的,占2个或4个字节001100010000000000000001字符型数据浮点型数据是用来表示具有小数点的实数float型(单精度浮点型)double型(双精度浮点型)编译系统为double型变量分配8个字节15位有效数字浮点型数据字符常量:由单撇号括起来的单个字符或转义字符整型常量:不带小数点的数值系统根据数值的大小确定int型还是long型等浮点型常量:凡以小数形式或指数形式出现的实数C编译系统把浮点型常量都按双精度处理分配8个字节确定常量类型1.基本的算术运算符:+:正号运算符(单目运算符)-:负号运算符(单目运算符)*:乘法运算符/:除法运算符%:求余运算符+:加法运算符-:减法运算符二、数据类型

运算符与表达式说明两个整数相除的结果为整数如5/3的结果值为1,舍去小数部分如果除数或被除数中有一个为负值,舍入方向不固定。例如,-5/3,有的系统中得到的结果为-1,在有的系统中则得到结果为-2VC++采取“向零取整”的方法

如5/3=1,-5/3=-1,取整后向零靠拢%运算符要求参加运算的运算对象(即操作数)为整数,结果也是整数。如8%3,结果为2二、数据类型

运算符与表达式2.自增、自减运算符:作用是使变量的值1或减1++i,--i:在使用i之前,先使i的值加(减)1i++,i--:在使用i之后,使i的值加(减)1二、数据类型

运算符与表达式3.算术表达式和运算符的优先级与结合性:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C算术表达式运算对象包括常量、变量、函数等C语言规定了运算符的优先级和结合性二、数据类型

运算符与表达式4.不同类型数据间的混合运算:(1)+、-、*、/运算的两个数中有一个数为float或double型,结果是double型。系统将float型数据都先转换为double型,然后进行运算(2)如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行运算,结果是double型(3)字符型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算二、数据类型

运算符与表达式5.强制类型转换运算符强制类型转换运算符的一般形式为:(类型名)(表达式)(double)a(将a转换成double类型)(int)(x+y)(将x+y的值转换成int型)(float)(5%3)(将5%3的值转换成float型)有两种类型转换系统自动进行的类型转换强制类型转换二、数据类型

运算符与表达式6.C运算符(1)算术运算符

(+-*/%++--)(2)关系运算符

(><==>=<=!=)(3)逻辑运算符

(!&&||)(4)位运算符

(<<>>~|∧&)(5)赋值运算符

(=及其扩展赋值运算符)(6)条件运算符

(?:)二、数据类型

运算符与表达式6.C运算符(7)逗号运算符

(,)(8)指针运算符

(*和&)(9)求字节数运算符

(sizeof)(10)强制类型转换运算符

((类型))(11)成员运算符

(.->)(12)下标运算符

([

])(13)其他

(如函数调用运算符())二、数据类型

运算符与表达式主讲内容:一.C语言概述二.数据类型、运算符与表达式三.顺序结构、输入输出四.选择结构五.循环结构六.数组七.函数八.指针、结构体、共用体九.文件操作注:算法和结构体指针的内容放入数据结构课程C语句的作用和分类最基本的语句----赋值语句三、顺序结构输入输出C语句分为以下5类:(1)控制语句:if、switch、for、while、do…while、continue、break、return、goto等(2)函数调用语句(3)表达式语句(4)空语句(5)复合语句C语句的作用与分类在C程序中,最常用的语句是:赋值语句输入输出语句其中最基本的是赋值语句赋值语句题目:给出三角形的三边长,海伦公式求三角形面积。赋值语句解题思路:假设给定的三个边符合构成三角形的条件关键是找到求三角形面积的公式公式为:其中s=(a+b+c)/2归纳总结:1.赋值运算符“=”是赋值运算符作用是将一个数据赋给一个变量也可以将一个表达式的值赋给一个变量2.复合的赋值运算符在赋值符“=”之前加上其他运算符,可以构成复合的运算符a+=3

等价于

a=a+3赋值语句归纳总结:1.赋值运算符2.复合的赋值运算符3.赋值表达式一般形式为:

变量

赋值运算符

表达式对赋值表达式求解的过程:求赋值运算符右侧的“表达式”的值赋给赋值运算符左侧的变量赋值语句归纳总结:1.赋值运算符2.复合的赋值运算符3.赋值表达式4.赋值过程中的类型转换两侧类型一致时,直接赋值两侧类型不一致,但都是算术类型时,自动将右侧的类型转换为左侧类型后赋值定义变量时要防止数据溢出赋值语句归纳总结:1.赋值运算符2.复合的赋值运算符3.赋值表达式4.赋值过程中的类型转换5.赋值表达式和赋值语句赋值表达式的末尾没有分号,而赋值语句有分号一个表达式可以包含赋值表达式,但决不能包含赋值语句赋值语句归纳总结:1.赋值运算符2.复合的赋值运算符3.赋值表达式4.赋值过程中的类型转换5.赋值表达式和赋值语句6.变量赋初值inta=3,b=3,c;inta=3;相当于inta;a=3;赋值语句有关数据输入输出的概念用printf函数输出数据用scanf函数输入数据字符数据的输入输出三、顺序结构输入输出输入输出是程序中最基本的操作之一(1)所谓输入输出是以计算机主机为主体而言的(2)C语言本身不提供输入输出语句printf和scanf不是C语言的关键字,而只是库函数的名字putchar、getchar、puts、gets同样(3)在使用输入输出函数时,要在程序文件的开头用预编译指令

#include<stdio.h>或#include″stdio.h″输入输出的概念在C程序中用来实现输出和输入的,主要是printf函数和scanf函数这两个函数是格式输入输出函数用这两个函数时,必须指定格式printf与scanf1.printf函数的一般格式:printf(格式控制,输出表列)printf2.常用格式字符d格式符。用来输出一个有符号的十进制整数c格式符。用来输出一个字符s格式符。用来输出一个字符串f格式符。用来输出实数,以小数形式输出e格式符。指定以指数形式输出实数1.scanf函数的一般形式:scanf(格式控制,地址表列)scanf2.scanf函数中的格式声明与printf函数中的格式声明相似以%开始,以一个格式字符结束,中间可以插入附加的字符scanf("a=%f,b=%f,c=%f",&a,&b,&c);1.用putchar函数输出一个字符从计算机向显示器输出一个字符putchar函数的一般形式为:putchar(c)字符数据的输入输出2.用getchar函数输入一个字符向计算机输入一个字符getchar函数的一般形式为:getchar()主讲内容:一.C语言概述二.数据类型、运算符与表达式三.顺序结构、输入输出四.选择结构五.循环结构六.数组七.函数八.指针、结构体、共用体九.文件操作注:算法和结构体指针的内容放入数据结构课程选择结构程序设计选择结构和条件判断用if语句实现选择结构关系运算符和关系表达式逻辑运算符和逻辑表达式条件运算符和条件表达式选择结构的嵌套用switch语句实现多分支选择结构在现实生活中,需要进行判断和选择的情况是很多的如果你在家,我去拜访你如果考试不及格,要补考如果遇到红灯,要停车等待周末我们去郊游70岁以上的老年人,入公园免票选择结构和条件判断C语言有两种选择语句:(1)if语句,实现两个分支的选择结构(2)switch语句,实现多分支的选择结构选择结构和条件判断最常用的3种if语句形式:1.if(表达式)语句1(没有else子句)2.if(表达式)语句1else语句2(有else子句)3.if(表达式1)

语句1elseif(表达式2)语句2

┆elseif(表达式m)语句melse语句m+1(在else部分又嵌套了多层的if语句)用if语句实现选择结构说明:(1)整个if语句可写在多行上,也可写在一行上但都是一个整体,属于同一个语句(2)“语句1”…“语句m”是if中的内嵌语句

内嵌语句也可以是一个if语句(3)“语句1”…“语句m”可以是简单的语句,也可以是复合语句关系运算符及其优先次序关系运算符和关系表达式用来对两个数值进行比较的比较运算符C语言提供6种关系运算符:①<(小于)②<=(小于或等于)③>(大于)④>=(大于或等于)⑤==(等于)⑥!=(不等于)优先级相同(高)优先级相同(低)关系、算术、赋值运算符的优先级算术运算符(高)赋值运算符(低)关系运算符关系运算符和关系表达式c>a+b等效于c>(a+b)a>b==c等效于(a>b)==ca==b<c等效于a==(b<c)a=b>c等效于a=(b>c)关系表达式用关系运算符将两个数值或数值表达式连接起来的式子关系表达式的值是一个逻辑值,即“真”或“假”在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”关系表达式逻辑运算符及其优先次序

&&(逻辑与)||(逻辑或)!(逻辑非)逻辑表达式用逻辑运算符将关系表达式或其他逻辑量连接起来的式子判断年龄在13至17岁之内?age>=13&&age<=17判断年龄小于12或大于65?age<12||age>65逻辑运算符和逻辑表达式ab!a!ba&&ba||b真真假假真真真假假真假真假真真假假真假假真真假假逻辑运算真值表ab!a!ba&&ba||b非0非00011非000101假非01001假01100逻辑运算符的优先次序!→&&→||(!为三者中最高)与其他运算符的优先次序

!(高)算术运算符关系运算符&&和||赋值运算符(低)逻辑运算符及其优先次序逻辑表达式的值应该是逻辑量“真”或“假”编译系统在表示逻辑运算结果时以数值1代表“真”,以0代表“假”但在判断一个量是否为“真”时以0代表“假”,以非0代表“真”注意:将一个非零的数值认作为“真”逻辑表达式(1)若a=4,则!a的值为0(2)若a=4,b=5,则a&&b的值为1(3)a和b值分别为4和5,则a||b的值为1(4)a和b值分别为4和5,则!a||b的值为1(5)4&&0||2的值为1逻辑表达式判别某一年是否闰年,用逻辑表达式表示闰年的条件是符合下面二者之一:①能被4整除,但不能被100整除,如2008②能被400整除,如2000(year%4==0&&year100!=0)||year%400==0如果表达式值为1,则闰年;否则为非闰年逻辑表达式条件运算符的执行顺序:求解表达式1若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值条件运算符和条件表达式条件表达式的一般形式为表达式1?表达式2:

表达式3条件运算符优先于赋值运算符条件运算符的结合方向为“自右至左”以下为合法的使用方法:a>b?(max=a):(max=b);a>b?printf(“%d”,a):printf(“%d”,b);条件运算符和条件表达式在if语句中又包含一个或多个if语句称为if语句的嵌套一般形式:if()if()语句1else语句2elseif()语句3else语句4内嵌ifelse总是与它上面最近的未配对的if配对选择结构的嵌套switch语句的作用是根据表达式的值,使流程跳转到不同的语句switch语句的一般形式:switch(表达式){case常量1:语句1case常量2:语句2

┇case常量n:语句ndefault:语句n+1}整数类型(包括字符型)switch语句不能相同用while语句实现循环用do---while语句实现循环用for语句实现循环循环的嵌套几种循环的比较改变循环执行的状态循环程序举例循环结构程序设计大多数的应用程序都会包含循环结构循环结构和顺序结构、选择结构是结构化程序设计的三种基本结构,它们是各种复杂程序的基本构造单元循环结构程序设计while语句的一般形式如下:while(表达式)语句“真”时执行循环体语句“假”时不执行循环条件表达式while循环的特点是:先判断条件表达式,后执行循环体语句while语句do---while语句的特点:先无条件地执行循环体,然后判断循环条件是否成立do---while语句的一般形式为:do

语句while(表达式);表达式YN循环体语句do---while语句for语句的一般形式为for(表达式1;表达式2;表达式3)语句

设置初始条件,只执行一次。可以为零个、一个或多个变量设置初值执行for语句循环条件表达式,用来判定是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环作为循环的调整器,例如使循环变量增值,它是在执行完循环体后才进行的for语句的执行过程:(1)先求解表达式1(2)求解表达式2,若其值为真,执行循环体,然后执行下面第(3)步。若为假,则结束循环,转到第(5)步(3)求解表达式3(4)转回上面步骤(2)继续执行(5)循环结束,执行for语句下面的一个语句for语句一个循环体内又包含另一个完整的循环结构,称为循环的嵌套内嵌的循环中还可以嵌套循环,这就是多层循环3种循环(while循环、do…while循环和for循环)可以互相嵌套循环的嵌套(1)一般情况下,3种循环可以互相代替(2)在while和do---while循环中,循环体应包含使循环趋于结束的语句。(3)用while和do---while循环时,循环变量初始化的操作应在while和do---while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。几种循环的比较用break语句提前终止循环break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句用continue语句提前结束本次循环有时并不希望终止整个循环的操作,而只希望提前结束本次循环,而接着执行下次循环。这时可以用continue语句break语句和continue语句的区别改变循环执行的状态N表达式1Y表达式2N……Y…………N表达式1Y表达式2NY…………break语句continue语句强行退出循环只结束本次循环break语句和continue语句的区别主讲内容:一.C语言概述二.数据类型、运算符与表达式三.顺序结构、输入输出四.选择结构五.循环结构六.数组七.函数八.指针、结构体、共用体九.文件操作注:算法和结构体指针的内容放入数据结构课程教学目的: 通过本章的学习,要求能熟练掌握数组的基本概念,熟练掌握一维数组、二维数组和字符数组的定义、赋值,熟练掌握数组的输入和输出方法,掌握字符串和字符数组的不同特点,掌握数组的排序、查询等基本操作方法。学习数组知识为后续章节做好准备,也为后续面向对象语言课程的学习打下基础。数组重点和难点

(1)一维数组的定义与应用

(2)数组的排序

(3)二维数组的定义与应用

(4)字符数组与字符串的应用数组1.一般定义一维数组的定义方法一般为:类型说明符

数组名[常量表达式]其中类型可以是任何的C语言数据类型,例如char,int,long,float,double等,数组名与普通变量名一样,常量表达式是数组在内存中的单元数,在定义时必须是一个常数,不能是变量,数组的每个单元占的字节数就是对应类型占的字节数,显然数组占的总字节数是:常量表达式*sizeof(类型)例如:chars[20]; /*定义能存储20个字符的数组*/intn[20];/*定义能存储20个整数的数组*/floatf[20];/*定义能存储20个float数的数组*/一维数组的定义和引用数组定义中常见的错误举例说明如下:floata[0]; /*数组大小为0没有意义*/intb(2);/*不能使用圆括号*/intk,a[k];/*不能用变量说明数组大小*/2.定义及初始化数组在定义时还可以同时为各个单元设置初始值。⑴定义时给所有元素赋值,例如:

chars[5]={’a’,’b’,’c’,’d’,’e’};定义数组s[5],并且设置s[0]=’a’,s[1]=’b’,s[2]=’c’,s[3]=’d’,s[4]=’e’⑵定义时给部分元素赋值,例如:

chars[5]={’a’,’b’};定义数组s[5],并且设置s[0]=’a’,s[1]=’b’,s[2]=’\0’,s[3]=’\0’,s[4]=’\0’,即后面没有赋值的元素全部设置为0。⑶定义时给所有的元素赋值,则可以不设置数组的大小,例如:

chars[]={’a’,’b’,’c’,’d’,’e’};与

chars[5]={’a’,’b’,’c’,’d’,’e’};是等价的。1.一维数组元素的引用方式数组名[下标]下标可以是整型常量或整型表达式。例如:a[0]=a[5]+a[7]-a[2*3]一维数组的引用二维数组的定义二维数组实际上就是一维数组的数组,即它的每一个一维元素都是一个一维数组,定义如下:类型说明符数组名[常量表达式][常量表达式];例如:inta[3][5];二维数组的定义和引用a是一个二维数组,其中a[0],a[1],a[2]每一个都是一维数组,它们各有5个元素,分别是:a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[0][4]a[1][0]、a[1][1]、a[1][2]、a[1][3]、a[1][4]a[2][0]、a[2][1]、a[2][2]、a[2][3]、a[2][4]其中a[i][j](i=0,1,2,j=0,1,2,3,4)是一个整数单元,这个数组共有15个整数单元,它们在内存中的分布是先按行排列再按列排列,a[0][0]是第1个元素,a[1][0]是第6个元素,……,a[2][4]是第15个元素,如下表所示。a[0][0]a[0][1]a[0][2]a[0][3]a[0][4]a[1][0]a[1][1]a[1][2]a[1][3]a[1][4]a[2][0]a[2][1]a[2][2]a[2][3]a[2][4]二维数组在定义时也可以对各个元素初始化,例如:inta[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};初始化的数据按先排列行再排列列的顺序为每一个元素赋值,赋值的结果如下表所示。a[0][0]=1a[0][1]=2a[0][2]=3a[0][3]=4a[0][4]=5a[1][0]=6a[1][1]=7a[1][2]=8a[1][3]=9a[1][4]=10a[2][0]=11a[2][1]=12a[2][2]=13a[2][3]=14a[2][4]=15在初始化时如提供的数据不够,则后面的元素自动为0,例如:inta[3][5]={1,2,3,4,5,6,7,8,9,10,11};赋值的结果如下表所示。a[0][0]=1a[0][1]=2a[0][2]=3a[0][3]=4a[0][4]=5a[1][0]=6a[1][1]=7a[1][2]=8a[1][3]=9a[1][4]=10a[2][0]=11a[2][1]=0a[2][2]=0a[2][3]=0a[2][4]=0也可以用大括号来划分初始值,例如:

inta[3][5]={{1,2,3,4,5},{6},{7,8}};其中{1,2,3,4,5}对a[0]数组赋初始值,{6}对a[1]数组赋初始值,{7,8}对a[2]数组赋初始值,赋值的结果如下表所示。a[0][0]=1a[0][1]=2a[0][2]=3a[0][3]=4a[0][4]=5a[1][0]=6a[1][1]=0a[1][2]=0a[1][3]=0a[1][4]=0a[2][0]=7a[2][1]=8a[2][2]=0a[2][3]=0a[2][4]=0在明确了括号的对数后,数组的第1维可以不写,但第2维不能不写,例如:inta[][5]={{1,2,3,4,5},{6},{7,8}};系统也会知道第1维是3,等价于:inta[3][5]={{1,2,3,4,5},{6},{7,8}};

s[0]‘o‘‘n‘‘e‘‘\0‘s[1]‘t‘‘w‘‘o‘‘\0‘s[2]‘t‘‘h‘‘r‘‘e‘‘e‘‘\0‘二维数组的数值数组被广泛应用于数学的矩阵计算中,二维数组的字符数组可用来存储一组字符串,例如:chars[3][8]={"one","two","three"};其中,s[0],s[1],s[2]都是一个8个字符的一维字符数组,分别存储"one"、"two"、"three"字符串,赋值的结果如下表5-5所示。表5-5二维数组的引用1.二维数组元素的表示形式:数组名[下标][下标]例如:a[2][3]下标可以是整型表达式,如a[2-1][2*2-1]数组元素可以出现在表达式中,也可以被赋值。例如:b[1][2]=a[2][3]/2在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。一维字符数组一维字符数组是char型的数组,因为它的每一个元素是一个char型变量,可以用来存放字符串,因此比较特别,例如:chara[5];定义了一个字符数组,它有a[0],a[1],a[2],a[3],a[4]共5个元素,可以为它们赋值,例如:a[0]=‘H‘;a[1]=‘e‘;a[2]=‘l‘;a[3]=‘l‘;a[4]=‘o‘;也可以在定义时就对各个元素赋值,例如:chara[5]={‘H‘,‘e‘,‘l‘,‘l‘,‘o‘};字符数组和字符串一维字符数组与字符串 字符串是一组字符,这些字符在内存中连续分布,在最后一个字节单元中用‘\0‘表示结束,这种结构与字符数组十分相似,实际上字符数组可以用来表示和存储字符串。例如:charb[6]={"Hello"};charb[6]={‘H‘,‘e‘,‘l‘,‘l‘,‘o‘,‘\0‘};以上两种定义方法是完全等价的。字符串输入输出函数gets是用来输入字符串的函数,使用方法是:

gets(字符数组);

gets()函数从输入流中读取一行字符,一直读到‘‘\n’’,但不包括‘‘\n’’字符,最后在末尾自动加上‘‘\0’’的结束标志。如果字符串的长度超过字符数组的容量,C程序不会自动停止读取字符,程序设计人员应设法保证读取的字符数不要超过字符数组的容量,不然数组越界会带来预想不到的错误。puts函数是用来输出字符串,使用方法是:

puts(字符数组);

puts()输出一个字符串,之后输出‘‘\n‘‘换行。常用字符串函数字符串在程序中大量用到,关于字符串有一些常用的函数,这些函数在string.h头文件中说明,在使用时程序的开始部分要包含下面语句:#include<string.h>1.strlen函数strlen意思是stringlength。strlen函数用来测试字符串的长度,即从第一个字符开始一直到‘\0‘之前的一个字符的总字符数,方法是:strlen(字符数组或字符串);

该函数返回一个整数表示字符串的长度,例如:strlen("How");值为3strlen("Howabout?");值为10strlen("C语言");值为5,一个汉字占两个字节2.strcpy函数strcpy意思是stringcopy。strcpy函数把一个字符串或字符数组复制到另一个字符数组中,方法是:strcpy(字符数组,字符数组或字符串);例如:

chars[18],t[18];strcpy(s,"Hello");/*s数组中存储了"Hello"*/strcpy(t,s);/*t数组中也存储了"Hello"*/

在字符串的使用中千万不能把一个字符串直接赋值给另外一个字符数组,例如以下语句是错误的:

chars[]={"Hello"};chart[10];t=s;/*错误!应该是strcpy(t,s);*/在使用strcpy时一定要保证存储字符串的数组空间要足够大,能容纳所复制的字符串,不然也会导致越界,例如下面的语句是不合适的:chars[5];strcpy(s,"123456");strcpy的作用就是把字符串中的字符连同‘\0‘一起复制给另外一个字符数组。

3.strcat函数strcat意思是stringcatenate。strcat函数完成两个字符串的连接,方法是:strcat(字符数组,字符数组或字符串);执行后会把另一个字符串连接在已有字符串后面,形成一个更长的字符串,例如:chars[18];strcpy(s,"How");/*s为"How"*/strcat(s,"are");/*s为"Howare"*/strcat(s,"you?");/*s为"Howareyou?"*/在使用strcat函数时一定要保证存储字符串的数组空间要足够大,能容纳所连接后的字符串,不然也会导致越界,例如下面的语句是不合适的:chars[]={"How"};strcat(s,“are”);/*s只有4个字节的空间,不能容 纳"Howare"*/4.strcmp函数strcmp函数是用来比较两个字符串的大小的,方法是:strcmp(字符串1,字符串2);当字符串1>字符串2时,返回一个正整数;当字符串1=字符串2时,返回0;当字符串1<字符串2时,返回一个负整数。两个字符串的比较是按字母的ASCII码或汉字内码的值来比较的,程序把字符串在内存中的每一个字节看成是一个无符号二进制数,比较在两个字符串的字节之间进行,比较规则如下:⑴比较两个字符串的字节值,如两个对应字节一样,则继续比较下一个字节。⑵如两个对应的字节不同,则字节值大的字符串大。⑶如比较时其中一个字符串结束,字节值都一样,则字符串长的那一个大。⑷两个字符串相等当而且仅当它们两个一样长,而且每一个字节值完全相等。根据ASCII码规则,字符比较一般有以下原则:空格<‘0‘<‘1‘<…<‘9‘<‘A‘<‘B‘<…<‘Z‘<‘a‘<‘b‘<…<‘z‘<汉字主讲内容:一.C语言概述二.数据类型、运算符与表达式三.顺序结构、输入输出四.选择结构五.循环结构六.数组七.函数八.指针、结构体、共用体九.文件操作注:算法和结构体指针的内容放入数据结构课程教学目的 通过本章的学习,要求能熟练掌握函数的定义和调用方法,掌握函数的嵌套调用和递归调用,理解变量的作用域和存储类别,掌握内部函数和外部函数,并能够在不同情况下灵活选择函数来解决实际问题。掌握编译预处理命令的使用方法。函数和预处理命令是编写模块化程序的重要方法,这将为编写比较复杂的程序设计的学习打下基础。2023/5/18函数与预处理教学内容2023/5/18函数与预处理函数编译预处理文件包含命令宏定义条件编译函数调用变量的作用域和存储类别内部函数和外部函数函数的定义重点难点

(1)函数的定义和函数调用

(2)函数的参数传递

(3)变量的作用域和存储特性2023/5/18函数与预处理从函数使用的角度看,函数可分为库函数和用户定义函数两种。(1)库函数:由编译系统提供的已设计好的函数,用户只需调用而无须实现它,在编译C程序时,应尽可能的使用库函数。这样可以提高编程效率和编程的质量。在前面各章的例题中反复用到的printf、scanf、getchar、putchar、gets、puts、strcat等函数均属于库函数。使用库函数时应注意:

1) 函数的功能;

2) 函数参数的数目、顺序以及每个参数的意义和类型;

3) 函数返回值的意义和类型;

4) 需要使用的包含文件。要调用某个库函数,则需在程序的头部用包含命令(#include)将说明该函数原型的头文件包含进本程序中。2023/5/18函数的分类

(2)用户定义函数:顾名思义,就是程序员自行定义和设计的函数。库函数一般只能提供一些低层服务的功能。而用户自定义的函数则能针对具体的应用实现一些特殊的功能。用自定义函数需要程序员自己来编写函数功能的实现代码。用户自定义函数是由用户按需要写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。2023/5/18函数的分类

C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。(1)有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。如数学函数即属于此类函数。由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。(2)无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”,空类型的说明符为“void”。2023/5/18函数的分类

定义无参函数的一般形式为:

【函数类型】函数名() {

声明语句部分 可执行语句部分

}

2023/5/18函数的定义无参函数定义的一般形式

定义有参函数的一般形式为:

【函数类型】函数名(数据类型参数【,数据类型参数2…】) {

声明语句部分 可执行语句部分

}2023/5/18有参函数定义的一般形式

一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。而在第一个阶段只设计最基本的模块,功能可以在设计好框架以后慢慢补上。在编写程序的开始阶段,往往是先写上一个空函数,占个位置,以后再用编写好的函数来替换它。这样,程序的结构比较清楚,可读性比较好,以后扩充新功能也比较方便,对程序结构影响不大。在程序设计中空函数常常被使用到,它的定义形式为:

【函数类型】函数名() { }2023/5/18空函数

函数的参数分为形参和实参两种。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。2023/5/18函数的参数和返回值形式参数和实际参数

函数的形参和实参具有以下特点:

1.形参变量只有在被调用时才分配内存单元,在调用结束时,所分配的内存单元也将被释放。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。

2.实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值、输入等办法使实参获得确定值。

3.实参和形参在数量、类型、顺序上应严格一致,否则会发生类型不匹配的错误。

4.函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。2023/5/18函数的参数和返回值形式参数和实际参数

函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并通过return语句返回给主调函数的值。如调用sqrt()函数取得开根号的值,调用例6.2的sum函数取得的两数之和等。对函数的返回值(或称函数的值)有以下一些说明:

1.函数的值只能通过return语句返回主调函数。return语句的一般形式为:return表达式;或者为:return(表达式);该语句的功能是计算表达式的值,并返回给主调函数。在函数中允许有多个return语句,但每次调用只能有一个return语句被执行,因此一个函数最多只能返回一个函数值。

2023/5/18函数的返回值2.函数返回值的类型和函数定义中的函数类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。3.如果函数返回值为整型,在函数定义时可以省去类型说明。4.没有返回值的函数,可以明确定义为“空类型”,类型说明符为“void”。2023/5/18函数的返回值使用函数定义时的几点说明:1)最好在参数列表中列出每个参数的类型,即使参数是默认的int。2)如果参数的类型声明放在()内的形参表中,则对每个形参都要进行对应的类型说明,不能省略。如:

floatmax(floatx,floaty)不能写成floatmax(foatx,y)。此时y为系统缺省的int类型。3)无论有无形参,函数名后的括号都不能省略。4)函数不能嵌套定义,既一个函数的定义不能从属于另外一个函数。5)应尽可能多的使用系统提供的库函数。6)为避免混淆,传递给函数的参数和函数定义中的相应的参数尽量不使用相同的名字。7)选择有意义的参数名和函数名可以使程序具有良好的可读性,这可以避免过多地使用注释。8)需要大量参数的函数可能包含较多的功能(任务),这种情况应该考虑将该函数分成完成单个任务的较小的函数。9)函数原型、函数头部和函数调用应该具有一致的参数个数、参数类型、参数顺序和返回值类型。函数的返回值

函数名(实参列表);如果调用无参函数,则”实参列表”是空的,但括号不能省略。如果实参列表包含多个实参,则各参数间用逗号隔开。实参和形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据。当实参列表包括多个值时,对实参求值的顺序并不确定。有的系统按自左向右求实参的值,有的则按自右向左的顺序。要注意的是,visualc++6.0编译器是按自右向左的顺序求实参列表的值的。2023/5/18函数调用函数调用的一般形式按函数在程序中出现的位置来分,可以有一下三种函数调用的方式。1. 函数语句把函数调用作为一个语句。如例6.1中的printstart();这时不要求函数带返回值,只要求函数完成一些操作。2. 函数表达式函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:s=sum(a,b)+sum(x,y);函数sum是表达式的一部分,将sum(a,b)的值加上sum(x,y)的和赋值给s。3. 函数参数函数调用作为一个函数的参数,例如:s=sum(a,sum(b,c));其中,sum(b,c)是一次函数调用,它的值作为sum另一次调用的参数。s的值为a,b,c三数的总和。函数调用的方式如果一个函数要调用另外一个函数,首先是被调用的函数必须存在。其次还应在主调函数中对所有被调函数加以说明,否则,在连接时会出现找不到所调用函数的错误信息。同变量一样,函数的调用也应遵循“先定义后使用”的原则。对被调函数的声明分为两种情况:(1)如果被调函数是C语言系统提供的标准库函数,则在源程序文件的开头处,使用#include命令,将存放所调用库函数的有关“头文件”包含到该程序文件中来。

#include<math.h>或#include"stdio.h"(2)如果被调用函数为用户自己定义的函数,一般情况下,应在主调函数中对被调用函数(返回值)的类型进行说明。函数的说明方法是:在主调函数的声明部分对被调函数进行声明。在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。对被调用函数的声明和函数原型

一般地说,函数的嵌套调用是指在执行被调用函数时,该函数又调用其它函数的情形。C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用,这样就出现了函数的嵌套调用,即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。注意:被调用函数执行完毕后,将返回到调用函数的断点继续执行。简言之,谁调用返回到谁的断点继续执行。 函数的嵌套调用说明

一个函数如果只能被本文件中其它函数所调用,称为内部函数,内部函数又称静态函数。在定义内部函数时在函数名和函数类型前面加static。即:

static函数类型函数名(形参列表){

函数体

}

例:staticintfun(inta,intb)

特点:只能被本文件中的函数所调用。优点:不用担心与其它源文件中的函数同名,因为即使同名也没关系。内部函数和外部函数内部函数一个函数可以被其它文件中其它函数所调用,就称为外部函数。在定义函数时可冠以关键字extern(省略也可),表示此函数是外部函数。即:extern函数类型函数名(形参列表){函数体}如:externintfun(inta,intb)特点:允许被所有源文件中的函数所调用。注意:调用其它源文件中的外部函数时,需要对其进行说明。外部函数

局部变量也称为内部变量。局部变量是在函数内(包括函数说明和函数体)作定义说明的,其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。

关于局部变量的作用域还要说明以下几点:(1)主函数中定义的变量只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。(2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。(3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。(4)在复合语句中也可定义变量,其作用域只在复合语句范围内。

变量的作用域局部变量

全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于整个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。2023/5/18全局变量(1)外部变量的作用域:从定义点到本文件结束。为方便使用,建议将外部变量的定义放在文件开头。(2)在同一源文件中,允许外部变量和内部变量同名。在内部变量的作用域内,外部变量不起作用。(3)外部变量可实现函数之间的数据共享,但又使这些函数依赖这些外部变量,因而使得这些函数的独立性降低。从模块化程序设计观点来看,这是不利的。因此不是非用不可时,不要使用外部变量。全局变量

C语言中的变量,不仅有类型特性,还有存储特性,从变量值存在的时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。

1.动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。自动内部变量(auto)、寄存器变量(register)2.静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态内部变量(static)、外部变量(extern)。变量的存储类别动态存储和静态存储对静态局部变量的说明:(1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。(2)静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。(3)如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。2023/5/18用static声明的局部变量在C语言源程序中允许用一个标识符来表示一个字符串,称为”宏”。被定义为“宏”的标识符称为”宏名”。在编译预处理时,对程序中所有出现的”宏名”,都用宏定义中的字符串去代换,这称为”宏代换”或”宏展开”。宏定义是由源程序中的宏定义命令完成的,宏代换是由预处理程序自动完成的。在C语言中,”宏”分为有参数和无参数的两种。下面分别讨论这两种“宏”的定义和调用。1.无参宏定义无参宏的宏名后不带参数。其定义的一般形式为:#define标识符字符串其中的”#”表示这是一条预处理命令,凡是以”#”开头的均为预处理命令,”define”为宏定义命令,”标识符”为所定义的宏名,”字符串”可以是常数、表达式、格式串等。宏定义使用中应注意下面几点:(1)习惯上宏名一般用大写字母表示;(2)宏定义不是C语句,书写时行末不应加分号;(3)在进行宏定义时,可以引用已定义的宏名;(4)当宏体是表达式时,为稳妥起见常将它用括弧括起来;(5)宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。#include”stdio.h”#defineOK100voidmain(){ printf("OK"); }上例中定义宏名OK表示100,但在printf语句中OK被引号括起来,因此不作宏代换。程序的运行结果为:OK而不是100.这表示把”OK”当字符串处理。宏定义(6)若宏名字出现在标识符内,则预处理时它也不被替换。(7)同一个宏名可以重复定义,如果不一致,编译时会发出警告,并以最后一次定义为准。(8)当宏定义在一行中写不下时,可在行尾用反斜杠“\”进行续行。(9)宏定义通常放在源程序文件的开头,其作用域是整个源程序.也可以在函数内部作宏定义,这时宏名字的作用域只在本函数.可用#undef终止宏定义的作用域。(10)与变量定义不同,宏定义只作字符替换,不分配内存空间,也不做正确性检查。(11)宏定义时可以不包含宏体,即写成:#define宏名这种写法也是合法的,此时仅说明宏名已被定义。宏定义2.带参宏定义

C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

带参宏定义的一般形式为:

#define宏名(形参表)字符串

在字符串中含有各个形参。

带参宏调用的一般形式为:

宏名(实参表);宏定义主讲内容:一.C语言概述二.数据类型、运算符与表达式三.顺序结构、输入输出四.选择结构五.循环结构六.数组七.函数八.指针、结构体、共用体九.文件操作注:算法和结构体指针的内容放入数据结构课程教学目的: 通过本章的学习,要求能掌握指针的基本概念,熟练掌握指针变量的类型说明和指针变量的赋值和运算方法,熟练掌握一维数组指针的表示方法,掌握二维数组的指针表示方法,掌握指针在字符串和函数中的使用方法。本章内容为后续结构体、文件、课程设计的学习作好准备,同时,本章的内容为后续课程数据结构的学习奠定基础。指针指针内容指针与指针变量指针变量的类型说明指针变量的赋值和运算一维数组的指针表示方法指针与数组二维数组的指针表示方法数组名和数组指针变量作函数参数字符串指针变量的说明和使用指针与函数字符串指针变量与字符数组的区别指针与字符串指针型函数指针数组函数指针变量指针型函数字符串指针变量的说明和使用对指针变量的类型说明包括三个内容:(1)指针类型说明,即定义变量为一个指针变量;(2)指针变量名;(3)变量值(指针)所指向的变量的数据类型。指针变量的一般形式为:类型说明符*变量名;其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。指针变量的类型说明(1)指针变量初始化inta=10;int*p=&a;或者直接使用:inta=10,*p=&a;(2)赋值语句inta;int*p;p=&a;不允许把一个数赋予指针变量,下面的赋值是错误的:

int*p;p=1000;被赋值的指针变量前不能再加“*”说明符,如写为*p=&a;也是错误的。指针变量的赋值指针变量可以进行某些运算,但其运算的种类是有限的。它只能进行赋值运算和部分算术运算及关系运算。1.指针运算符(1)取地址运算符&(2)取内容运算符*指针变量的运算2.指针变量的运算1)赋值运算2)加减算术运算指针变量的赋值运算有以下几种形式:(1)指针变量初始化赋值,前面已作介绍。(2)把一个变量的地址赋予指向相同数据类型的指针变量。(3)把一个指针变量的值赋予指向相同类型变量的另一个指针变量。(4)把数组的首地址赋予指向数组的指针变量。(5)把字符串的首地址赋予指向字符类型的指针变量。(6)把函数的入口地址赋予指向函数的指针变量。指针变量的运算数组指针变量说明的一般形式为:类型说明符*指针变量名其中类型说明符表示所指数组的类型。从一般形式可以看出指向数组的指针变量和指向普通变量的指针变量的说明是相同的。引入指针变量后,就可以用两种方法来访问数组元素了。第一种方法为下标法,即用a[i]形式访问数组元素。在第5章中介绍数组时都是采用这种方法。第二种方法为指针法,即采用*(pa+i)形式,用间接访问的方法来访问数组元素。一维数组的指针表示方法字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的,只能按对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。如:charc,*p=&c;表示p是一个指向字符变量c的指针变量。而:char*s="CLanguage";则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。指针与字符串用字符数组和字符指针变量都可实现字符串的存储和运算,但是两者是有区别的。在使用时应注意以下几个问题:1.字符串指针变量本身是一个变量,用于存放字符串的首地址,而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由若干个数组元素组成的,它可用来存放整个字符串。2.对字符数组作初始化赋值,必须采用外部类型或静态类型,如:staticcharst[]={“CLanguage”};而对字符串指针变量则无此限制,如:char*ps="CLanguage";3.对字符串指针方式char*ps="CLanguage";可以写为:char*ps;

ps="CLanguage";而对数组方式:staticcharst[]={"CLanguage"};不能写为:charst[20];st={"CLanguage"};只能对字符数组的各元素逐个赋值。使用字符串指针变量与字符数组的区别在C语言中规定,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数,然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。函数指针变量定义的一般形式为:类型说明符(*指针变量名)(形参类型1,形参类型2…);其中“类型说明符”表示被指向函数的返回值的类型。“(*指针变量名)”表示“*”后面的变量是定义的指针变量。最后的括号和括号内的形参,表示指针变量所指的是一个函数。例如:int(*pf)(int,int);表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。指针与函数函数指针变量如果一个数组的元素值为指针则该数组称为指针数组。指针数组是一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。指针数组说明的一般形式为:类型说明符*数组名[数组长度]其中类型说明符为指针值所指向的变量的类型。例如:int*pa[3]表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。通常可用一个指针数组来指向一个二维数组。指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。指针数组指向指针的指针变量定义如下:类型标识符**指针变量名例如:float**ptr;其含义为定义一个指针变量ptr,它指向另一个指针变量(该指针变量又指向一个实型变量)。由于指针运算符"*"是自右至左结合,所以上述定义相当于:float*(*ptr);指向指针的指针变量与指针有关的各种说明和意义:int*p;

p为指向整型量的指针变量int*p[n];

p为指针数组,由n个指向整型量的指针元素组成。int(*p)[n];

p为指向整型二维数组的指针变量,二维数组的列数为nint*p()

p为返回指针值的函数,该指针指向整型量int(*p)()

p为指向函数的指针,该函数返回整型量int**p

p为指向另一指针的指针变量,该指针指向一个整型量。在解释组合说明符时,标识符右边的方括号和圆括号优先于标识符左边的“*”号,而方括号和圆括号以相同的优先级从左到右结合。但可以用圆括号改变约定的结合顺序。内容

结构体、共用体和枚举类型结构型的引入,很好的处理生活总的各种表格或表格中的记录结构型的定义,结构型变量的定义、赋值、引用及引用链表等方法共用型的定义,共用型变量的定义、赋值、引用枚举型的定义,共用型变量的定义、赋值、引用结构体类型的定义结构体类型定义的一般形式struct结构型名{数据类型标识符成员1;数据类型标识符成员2;

数据类型标识符成员n;};请读者注意结构体定义语句的右花括号后面用分号(;)做语句结束标记。结构型变量成员的引用格

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论