C程序设计课件_第1页
C程序设计课件_第2页
C程序设计课件_第3页
C程序设计课件_第4页
C程序设计课件_第5页
已阅读5页,还剩151页未读 继续免费阅读

下载本文档

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

文档简介

C程序设计

第1章C语言概述

“高级语言”

汇编语言:优点:可以充分发挥机器硬件的功能,并提高质量。缺点:必须熟悉机器的指令系统,而指令系统又是和具体机器的内部结构密切相关的,所以所编写的程序依赖于计算机硬件,可读性和可移植性比较差。

一般高级语言:优点:可读性和可移植性比较好。缺点:难以对硬件进行操作,如内存地址、位操作等。

1.1介绍:

C语言:具有一般高级语言的特性,也具有汇编语言的优点,所以有人称为“中级语言”高级语言有的:高级语言没有的:

算术运算关系运算逻辑运算

位运算单目、三目运算复合运算

1、语言简洁、紧凑,使用方便、灵活。32个关键字、9种控制语句。

2、运算符丰富34种运算符

3、数据类型和数据结构丰富。基本类型(整型、字符型、实型)构造类型(数组、结构体、共用体)指针、文件、空类型数据结构(链、表、树、栈等)1.2C语言的特点

4、具有结构化控制语句

5、语法不严格松散结构,即语法检查不严格,编程时必须控制好。

6、C语言允许直接访问物理地址,能进行位操作。

7、目标代码质量高,程序执行效率高。

8、输入输出采用函数而无输入输出语句,可移植性好1.3

用C库函数组装程序

用库函数必须注意包含相应的头文件

#include<stdio.h>#include<math.h>#include<string.h>1.4

程序格式和特点1、main()函数必须有且唯一

2、函数是C语言程序的基本单位3、大小写敏感4、无行概念(1)、语句以分号结束

(2)、以#号开头的编译预处理语句无分号(3)、/*…*/加在C语言任何部分作注释说明采用小写,大写有特殊意义(宏,常量等)1.5

程序执行从main函数开始

TurboC是一个集成环境,编辑、编译、连接、执行。1、源程序扩展名.c2、TurboC的使用

TC

选择工作目录建立工作环境建立工作环境F9编译、连接。运行Alt+R.3、建立工作环境例题例1-例3讲解、说明上机题:1、建立一个自己的工作环境2、熟悉TurboC环境3、输入并调试运行例1-例34、自己编写C程序习题1.5、1.6第2章数据描述和基本操作

程序

2.1C的数据类型:对数据的描述

(数据结构)

对操作的描述

(算法)

1、不同的数据占用的空间不同2、对应的运算不同数据类型(P38)2.2基本数据类型:1、整型

shout2字节int

机器字长(2字节)-215~(215-1)long

4字节2、无符号类型只对整型;也包含字符型,存放正数的范围扩大一倍Unsigned整型x;2.2基本数据类型:3、实型

float单精度

4字节double

双精度8字节longdouble长双精度16字节2.2基本数据类型:4、字符型存贮形式,按ASCII码值;占一字节;与整型通用,相当一个字节整数。

2.2基本数据类型:5、类型长度运算符sizeof(类型)用途:测试动态分配存贮空间

例如A=sizeof(int);

2.3常量和变量:1、常量(1)、数值常量整型常量实型常量十进制自然表示八进制零打头十六进制ox打头指数形式E(e)前面有数,后面是整数小数形式.必须有“.”(2)、字符型常量用单引号包围的单一字符‘a’‘A’字符常量没有结束标志(3)、字符串型常量用双引号包围的0个或多个字符序列“china”有结束标志(4)、特殊常量(一)符号常量如:宏定义#definePI3.14(二)转义字符(换码序列)\字母表示动作见P(48)2、变量(1)、变量的定义intx,y;先定义每个变量被指定为一确定类型便于编译系统检查如a%b(2)、变量标识符

C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须是字母或下划线。用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。保留关键字预定义标识符用户自定义(3)、变量的初始化定义变量的同时给变量赋值如:

intx=3,y=5;2.4表达式运算:1、说明例如表达式b=(a=x)*5运算符的功能与运算量的关系优先级结合方向结果类型2、算术运算符双目运算符5%3=2

-5%3=?5%-3=?+、-、*、/、%(模运算符或求余运算符)a%b这里a、b必须是整型数5/3=1-5/3=-1(-2)舍入的方向不因定,“向零取整原则”符号同左边的操作数3、算术表达式用算术运算符和括号将运算对象(也称操作数)连接起来,符合C语法规则的式子称C算术表达式。如:a*b/c-1.5+’a’同级时“从左到右”的结合原则4、复合的赋值运算

+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=只要有赋值号优先级较低,只比逗号运算符高如:a+=ba=a+b累加器,注意a一定是变量b可以是表达式或变量,结合规律从右到左A+=3a=a+3X*=y+8x=x*(y+8)5、自增减运算

++、--a++,++a自增a=a+1a--,--a自减a=a-1后置运算、前置运算只能用于变量,不能用于常量或表达式;结合方向是从右至左6、关系运算

<

<=

>

>=

==

!=If(x==y)真(非0为真)假(0为假)7、逻辑运算&&(与)||(或)!(非)(1)实型数不比较相等的1.0/3.0*3.0==1.0x=-y<ε就是小到一定形式就行了

ε=10-6或ε=10-8e1?e2:e3(e为表达式)8、条件运算(三目)3+3,6+8逗号表达式,又称顺序求值运算符9、逗号运算符和逗号表达式2.5类型转换:1、隐式转换(1)必然转换(2)由低向高转换,一次到位转换P54(3)赋值转换2、显示转换强制类型运算(类型)第3章简单的C程序设计

-顺序结构3.1C语句:1、表达式语句2、控制语句3、函数调用语句4、空语句5、复合语句3.2格式化输入输出函数:(一)、格式输出Printf(“格式控制”,输出项序列);(二)、格式输入scanf(“格式控制”,地址序列);3.3字符输入输出函数:(一)、输入字符getchar()(二)、输出一个字符Putchar(c);3.4顺序结构程序设计举例第4章逻辑运算和判断选取控制4.1条件分支:1、if语句的三种形式(1)、if(表达式)语句(2)、if(表达式)语句1;

else语句2;(3)if(表达式1)语句1;

elseif(表达式2)语句2;

elseif(表达式3)语句3;

……if语句的说明:(1)表达式一般为逻辑表达式或关系表达式,但可以是任意表达式,是任意的数值类型(整型、实型、字符型、指针型数据)(2)else前面的分号不可缺少,它是if语句内嵌语句所要求的,缺少时语法错误。(3)if和else后面可以是一个操作语句,也可以是多个操作语句,若为多个语句必须用复合语句。2、if语句的嵌套:if语句中又包含一个或多个if语句。if(表达式1)

if(表达式2)语句1;

else语句2;elseif(表达式3)语句3;

else语句4;3、条件运算符:

在if语句中执行一个赋值语句且给同一个变量。(1)条件运算符?:(2)条件运算符优先于赋值运算符,低于关系运算符和算术运算符。(3)条件运算符的结合方向“从右至左”(4)条件运算符不能取代一般的if语句(5)表达式1的类型可以与表达式2和表达式3的类型不同。4.2开关分支switch语句:是多分支选择语句格式:Switch(表达式){case判断值1:语句组1;break;case判断值2:语句组2;break;……default:语句组n;break;}switch语句的说明:(1)switch后面的表达式应是整型、字符型或是枚举。(2)若表达式的值与某个case后面的判断值相等时就执行case后面的语句组,没有匹配值时执行default后面的语句组。(3)case后面的判断值不能重复。(4)case和default出现的次序不影响执行结果。(5)执行完一个case后面的语句,则转到下一个case继续执行,所以必须用break语句跳出。第5章循环控制5.1循环结构:循环结构是结构化程序设计的三种基本结构之一(1)当型循环结构,当条件成立时反复执行操作,直到条件为假时才停止循环。(2)直到型循环结构:先执行操作,再判断条件是否为假,若条件为假,再执行。如此反复,直到条件为真为止。5.2C语言中循环语句:1.while2.for3.do……while当型循环,先判断后执行直到型循环,先执行后判断1.while和do……while语句(1)while(条件)

{

语句;

}如:

1.while和do……while语句(2)do{

语句;

}while(条件);如:

需要注意:

(1)循环前的初始值(2)循环体内必须改变循环条件,使其趋于结束(3)循环体如果包含一个以上语句,应以复合语句出现(4)当while后面的表达式第一次值为真时,二者等价,否则二者不同。循环次数不确定,只给结束条件。2.for语句“灵活”—循环次数确定或不确定(只给结束条件)for(初值表达式;条件;修正表达式){

语句;}如:

s=0;for(i=1;i<=100;i++)s+=i;for语句的说明:(1)条件为真,则执行for语句中指定的内嵌语句(2)初值表达式和修正表达式可以是逗号表达式(3)e1,e2,e3均可缺少,但分号保留(4)可以取代while语句(5)初值表达式可以和循环变量无关5.3辅助控制:1.break语句

(1)跳出switch结构

(2)用于循环体内,结束本层循环,一次退出一层循环2.continue语句

仅用于循环体内,使本次循环结束3.goto语句

goto

语句标号;标号:用标识符表示,规则同变量退出多重循环,从内到外5.4循环的嵌套:一个循环体内又包含另一个完整的循环结构三种循环结构可以互相嵌套。例题分析:例题分析:例1输入字符显示之。#include<stdio.h>Main(){charc;while((c=getchar())!=EOF)

putchar(c);}例题分析:例2打印ASCII码0-255的字符。第6章数组6.1一维数组的定义和引用:1定义类型说明符数组名[常量表达式]

如inta[10];说明:(1)数组名(2)用方括号(3)数组长度,元素个数(4)不能含变量数组:是有序数据的集合,数组中的元素应是同一类型。2引用先定义,后使用的原则C规定:逐个引用数组元素,不能一次引用整个数组数组元素的表示形式:数组名[下标]规定:下标是整型常量或整型表达式如a[5]或a[2*3]等3初始化(1)在定义数组时对数组元素赋以初值规定:只有静态存贮数组和外部存贮数组才能初始化

static---静态extern---外部(2)只给部分元素赋值(3)使数组中全部元素为0

(4)在对全部数组元素初始化时,可以不指定数组长度。6.2二维数组的定义和引用:1定义类型说明符数组名[常量表达式][常量表达式]

如inta[3][4];是特殊的一维数组存贮顺序:按行存贮,多维数组同理2引用数组元素的表示形式:数组名[下标][下标]

如a[0][0]或a[0][1]等3初始化6.3字符数组:用来存放字符数据的数组是字符数组,字符数组中每个元素存放一个字符。1定义类型说明符数组名[常量表达式]

如:chara[10];

inta[10];2初始化staticcharc[5]={‘c’,’h’,’i’,’n’,’a’};注(1)如果字符个数大于数组长度则语法错(2)如果字符个数小于数组长度则将字符赋给数组前面的元素,其余元素为空格(3)字符个数等于数组长度时可以省略数组长度3引用可以引用字符数组中的一个元素,得到一个字符。4字符串和字符串结束标志字符数组长度:实际长度\0;有效长度字符串结束标志‘\0’表示“china”共有5个字符,但占6个字节可以用字符串常量来初始化字符数组Staticcharc[]={“china”};也可写成staticcharc[]=“china”;

在C中将字符串作为字符数组来处理,为了测定字符串的实际长度‘\0’作为结束标志。5字符数组输入、输出(1)getchar()/putchar()(2)用格式符%c输入、输出(3)将整个字符串一次输入、输出,用格式符%s如Staticcharc[]=“china”;Printf(“%s”,c);注(1)输出字符不包括结束符\0;

(2)用%s时输出项是数组名;

(3)长度大于实际长度时也到、\0结束;

(4)用scanf函数输入一个字符串,利用一个scanf函数输入多个字符串时,以空格分隔。

staticcharc[6];

scanf(“%s”,c);

printf(“%s”,c);所以一维字符数组可以看作是“字符串变量”6字符串输入、输出(1)gets(str)

输入一个字符串到字符数组(2)puts(str)

可以包含转义字符,如’\0’,’\n’等7字符串函数#include<string.h>(1)拷贝strcpy(str1,str2);

目的源注:str1长度≥str2长度str1是数组名形式,str2可以是字符串常量,不能用赋值语句将字符串常量或字符数组赋给一个字符数组。如:str1={“china”};str1=str2;(2)字符串连接

strcat(str1,str2);

目的源注:作用是把字符2连到字符1后面,结果放在字符数组1中,所以字符数组1必须足够大,初始化时不能省略长度;连接时第一个\0取消。(3)字符串比较strcmp(str1,str2);(4)测试字符串长度函数strlen(str)(5)将字符串中大写字母转成小写字母函数strlwr(str)(6)将字符串中小写字母转成大写字母函数strupr(str)

第8章模块化程序设计8.1函数定义:在C中子程序的作用是由函数来完成的,使用的角度函数有两种(1)系统函数(2)用户定义函数;从函数的形式上分(1)无参函数(2)有参函数格式:函数类型函数名(形式参数)

{

函数体;

}模块化设计;结构化编程。说明:

函数类型---返回值的类型如:floataver(成绩表)

void---无返值main()就应是void类型默认时为int型形参:(inta,intb,……,floatr)

或(a,b,……,r)

inta,b;floatr;

函数类型函数名()

{}称为“空函数”8.2函数参数和函数值:1、形式参数和实际参数定义函数时函数名后面括号中的变量—形参调用函数时函数名后面括号中的表达式—实参通过函数调用使两个函数中的数据发生联系说明:(1)形参变量在函数调用前无分配存贮空间(2)实参可以是常量、变量、表达式或数组名(3)在被定义的函数中,必须指定形参类型(4)实参和形参类型应一致,否则类型不匹配错误(5)形参和实参间的传递是单向的“值传递”,不同单元。2、函数的返值(1)函数的返值是通过return语句获得的,return后面可以是一个表达式。(2)函数值的类型,在定义函数时指定函数值类型,如果不指定,按整型处理,函数类型决定返值类型。(3)如果被调函数中没有return语句,则返值不确定。(4)如果不带回值,应将函数定义为void类型。8.3函数的调用:1、函数调用的一般形式函数名(实参表列);说明:对实参表的求值顺序并不是确定的,一般是从右至左,这种情况在printf函数中也同样存在如:i=2;Printf(“%d%d\n”,i,++i);结果:332、函数的调用方式函数在程序中出现的位置;(1)函数语句(2)函数表达式(3)函数参数3、被调函数的说明在一个函数中调用另一个函数所具备的条件是:(1)被调函数是已经存在的函数(库函数、自定义)(2)如果是库函数则#include命令相关头文件(3)如果是用户自定义函数,在主调函数中对被调函数声明:函数类型函数名(参数表);特例:(1)函数的返值是整型或字符型(2)被调函数的定义在主调函数之前(3)在所有函数定义之前,说明了函数类型8.4函数的嵌套调用:关系:自身可调用,相互之间可调用,即在调用一个函数的过程中,又调用另一个函数。如图8.5函数1函数2函数3例8.6P1558.5函数的递归调用:1、直接递归2、间接递归函数A函数A函数B8.6数组作为函数参数:数组元素作参数同变量相同,数组名作为参数时传递整个数组。当用数组名作函数参数时,实参和形参都应用数组名(或指针变量)。例8.11P165说明(1)主调函数和被调函数分别定义数组(2)实参数组和形参数组类型应一致(3)实参数组和形参数组大小可以不一致,C编译对形参数组大小不作检查,只是将实参首址传递给形参数组。如:例8.12(4)不是“传值”而是“传址”例:8.13(5)也可以用多维数组名作函数参数,同上。例:8.148.7局部变量和全局变量:

1、局部变量在函数内定义的变量例:floatf1(inta){

intb,c;

…….}说明(1)主函数main中定义的变量只在主函数中有效(2)不同函数中可以使用相同的变量(3)形参也是局部变量(4)在一个函数内部,可以在复合语句中定义变量,这些变量只在复合语句中有效,离开复合语句该变量就无效。8.7局部变量和全局变量:

2、全局变量在函数之外定义的变量称为外部变量,外部变量是全局变量,全局变量可以为本文件中其它函数所共用,它的有效范围为“从定义的位置开始到文件结束”。例:8.15说明(1)设全局变量的作用是增加了函数间数据联系,可以从函数得到一个以上的返值,是“双向传递的”。(2)不要轻易使用全局变量在程序执行过程中都占用存贮单元;通用性降低;不清晰。(3)在定义点之前引用外部变量要用关键字extern作“外部变量说明”(4)在同一源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用。8.8动态存贮变量与静态存贮变量:

1、变量的存贮类别以上是从变量的作用域角度分;从变量值生存期角度分静态存贮变量和动态存贮变量。静态存贮区存放:全局变量动态存贮区存放:(1)函数形参变量(2)局部变量(未加static说明的)(3)函数调用时的现场保护和返回地址程序区静态存贮区动态存贮区用户区说明C语言中每个变量和函数有两个属性,数据类型和数据存贮类别,一般形式。存贮类别数据类型变量表;存贮类别:auto(隐含)自动

static

静态

register寄存器

extern外部8.8动态存贮变量与静态存贮变量:

2、局部变量的存贮方式(1)不作专门说明都是动态分配存贮空间的,存贮在动态存贮区中,编译系统自动处理。(2)有时希望函数中的局部变量值在函数调用结束后不消失这时就应该指定该局部变量为“局部静态变量”用static说明例8.17P174

说明C语言中每个变量和函数有两个属性,数据类型和数据存贮类别,一般形式。存贮类别数据类型变量表;存贮类别:auto(隐含)自动

static

静态

register寄存器

extern外部局部静态主变量说明(1)局部静态变量属于静态存贮类别,在静态存贮区内分配,存贮单元在程序整个运行期间都不释放(2)在编译时赋初值,只赋初值一次,并保留上次函数调用时的值(3)不赋值时编译时自动赋初值勤0(4)C规定只有全局变量和局部静态变量时才能对数组初始化(5)局部静态变量在函数调用结束后仍然存在,但其它函数是不能引用它的(6)对使用频繁的局部自动变量或形参,可以作为寄存器变量,用关键字register说明例8.19

(7)全局变量和局部静态变量不能定义为寄存器变量8.8动态存贮变量与静态存贮变量:

3、全局变量的存贮方式(1)允许其它文件中的函数引用(2)只能被本文件中的函数引用时,用static说明例staticinta;

存贮类别小结:P180

8.9内部函数和外部函数

1、内部函数函数只能被本文件中其它函数所调用。

staticintfun(inta,intb)2、外部函数

externintfun(inta,intb)

属于“隐含”例8.22

3、如何运行一个多文件的程序建立一个“项目文件”

第9章预处理命令

区别于其它高级语言:三种预处理功能宏定义文件包含条件编译用命令来实现用命令来实现并用“#”开头

9.1宏定义用一个指定的标识符来代表一个字符串

1、不带参数的宏定义命令的一般形式#define标识符(宏名)字符串如#definePI3.1415929在预编译时,将程序中出现的宏名进行宏展开。说明:P1882、带参数的宏定义(1)命令的一般形式#define宏名(形参表)字符串(2)带参数的宏展开预编译时遇到带实参的宏名时,则按命令行指定的字符串从左到右进行置换,原则是:遇形参则以实参代替,非形参字符原样保留,从而形成展开后的内容。说明P1902、带参数的宏定义(1)命令的一般形式#define宏名(形参表)字符串(2)带参数的宏展开预编译时遇到带实参的宏名时,则按命令行指定的字符串从左到右进行置换,原则是:遇形参则以实参代替,非形参字符原样保留,从而形成展开后的内容。说明P190(3)宏名的作用域是从宏名定义命令后到本文件结束,可用#undef

终止宏名的作用域如#undef

宏名(4)宏定义中可以引用已定义过的宏名(5)程序中双引号括起的字符串的内容若有与宏名相同的子串时,一般不进行宏展开。

9.2文件包含1、命令的一般形式#include“文件名”或#include<文件名>说明(1)文件名应是C语言的源文件名,该源文件可以是系统提供,也可以是用户编写。头文件、标题文件.h或.c

9.2文件包含(2)“”和<>的区别(3)一条include命令只能指定一个被包含的文件2、文件包含的处理预编译时,将被包含文件的内容全部复制到包含文件中,文件包含可以是嵌套的。

9.3条件编译1、#ifdef

标识符程序段1#else

程序段2#endif当指定标识符已经被定义过,则对程序段1进行编译,否则编译程序段2

9.3条件编译2、#ifndef

标识符程序段1#else

程序段2#endif当指定标识符未被定义过,则对程序段1进行编译,否则编译程序段2

9.3条件编译3、#if表达式程序段1#else

程序段2#endif当表达式的值为“真”(非零)时,编译程序段1,否则编译程序段2

说明(1)以上的“程序段”可以含语句和命令行(2)“标识符”一般是用#define命令定义(3)其中的#else部分可以没有第10章指针

有利于设计系统软件特点:表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效方便地使用数组;调用函数时得到多于1个的值;能直接处理内存地址。10.1指针的概念一个变量的地址称为该变量的“指针”一个变量存放另一个变量的地址(指针)则它是指针变量10.2变量的指针和指向变量的指针变量变量的“指针”就是变量的地址“*”--指向p是指针变量*p是p指向的变量如i=3;p=&i;一、指针变量的定义int

i,j;int*p1,*p2;指针变量定义的一般形式类型标识符*标识符;如:float*p3;char*p4;二、指针变量的引用(1)&取地址运算符(2)*指针运算符(间接访问运算符)&a变量a的地址*p指针变量p所指向的变量三、指针变量作为函数参数运用指针变量作参数,可以得到多个变化的值10.3数组的指针和指向数组的指针变量数组的“指针”就是数组的起始地址。

数组元素的指针是指数组元素的地址,引用数组元素可以用下标法(如a[3])也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)一、一维数组和指针指向数组元素的指针变量的定义与赋值inta[10];int*p;p=&a[0];或p=a;在定义变量时可以赋给初值

int*p=&a[0];或

*p=a;说明:1、一维数组和数组元素的地址数组名代表该数组的首地址,(数组中第一个元素的地址)例如inta[10],*p;则p=a和p=&a[0]是等价的

p=a+1和p=&a[1]等价

……p=a+i和p=&a[i]等价2、通过一维数组名所代表的地址引用数组元素数组名代表该数组的首地址,(数组中第一个元素的地址)*(a+i)代表第i个元素,即a[i]3、通过指针引用数组元素例inta[10],*p;若p=a;或p=&a[0];则p+i代表a数组第i个元素的地址,*(p+i)代表第i个元素a[i]4、通过带下标的指针引用数组元素*(p+i)可以写成p[i]综上所述:在p=a的条件下,对a[i]数组元素的引用方式可以是:*(a+i);*(p+i);p[i];注意:

1、a和a[0]具有不同含义,前者是一个地址常量,是存贮单元a[0]的地址;而后者是一个变量名,代表一个存放数据的存贮单元。

2、p是指针变量,可以对其进行加、减和赋值运算,如p++,p=a,p=&a[i]等运算都是合法的,而由于数组名a代表一个地址常量,即一个常量指针,因此a++,a=p,a+=i是非法的。二、二维数组和指针1、二维数组和数组元素的地址如inta[2][3];二维数组a中任一元素a[i][j]的地址与a[i]的关系是:&a[i][j]==a[i]+j注:a+1和a[0]+1的含义不同a和a[i]是两个基类不同的常量指针,*(a+1)代表a[1]而*(a[0]+1)则代表a[0][1]2、通过地址引用二维数组元素设二维数组a的定义同上,则a中任一元素a[i][j]的引用可以用以下表达式之一来表示*(a[i]+j)*(*(a+i)+j)(*(a+i))[j]3、通过一个指针数组引用二维数组元素设inta[2][3],*p[2]p是一个一维指针数组,其中每个元素都是一个指向整型变量的指针。若for(i=0;i<2;i++)

p[i]=a[i];使p数组中每个元素依次指向a数组中每行的起始元素,则二维数组元素a[i][j]的引用形式可以写成(1)*(p[i]+j)(2)*(*(p+i)+j)(3)(*(p+i))[j](4)p[i][j]4、通过一个行指针引用二维数组元素设inta[2][3],(*prt)[3];其中prt是一个指针变量,它指向包含三个整数元素的一维数组。注意,*prt两侧的园括号不可缺少,如果写成*prt[3]则prt将成为一个指针数组名若prt=a;则a[i][j]可以写成

*(prt[i]+j);*(*(prt+i)+j);(*(prt+i))[j];prt[i][j]10.4字符串的指针和指向字符串的指针变量1、字符串的表示形式

(1)用字符数组实现

staticcharstring[]=“IloveChina”;(2)用字符指针实现

char*string;string=“ILoveChina”;10.4字符串的指针和指向字符串的指针变量2、字符串指针作函数参数

如:P235例10.203、字符指针变量与字符数组的区别(1)字符数组由若干个元素组成,每个元素中放一个字符;而字符指针变量中存放的是地址,决不是将字符串放到字符指针变量中。3、字符指针变量与字符数组的区别(2)赋初值的方式不同对数组staticcharstr[]=“ILoveChina!”;对字符指针char*a=“ILoveChina!”;3、字符指针变量与字符数组的区别(3)赋值方式不同不能用charstr[14];

str=“ILoveChina!”;而字符指针变量可以

char*a;a=“ILoveChina!”;3、字符指针变量与字符数组的区别(4)指针变量的值是可以改变的

char*a=“ILoveChina!”;a+=7;3、字符指针变量与字符数组的区别(5)可以表示格式字符串

char*format=“a=%d,b=%f\n”;

printf(format,a,b);或:staticcharformat[]=“a=%d,b=%f\n”;

printf(format,a,b);10.5函数的指针和指向函数的指针变量1、指向函数的指针变量的一般定义形式数据类型标识符(*指针变量名)()

返值类型10.5函数的指针和指向函数的指针变量2、函数的调用可以通过函数名调用,也可以通过函数指针调用。如

c=max(a,b);

intmax();

int(*p)();p=max;c=(*p)(a,b);10.5函数的指针和指向函数的指针变量3、函数的指针变量可以改变p=min;4、在给函数指针赋值时,只用函数名5、用函数指针调用函数时,只需要将(*p)代替函数名即可,如c=(*p)(a,b);6、函数指针变量p+n,p++,p--;运算是无意义的7、可以用指向函数的指针变量作函数的参数如:P244页10.6返回指针值的函数定义的一般形式:类型标识符*函数名(参数表)如int*a(int

x,inty)例:P246例10.25

仔细读!10.7指针数组和指向指针的指针1指针数组的定义形式类型标识*数组名[数组长度说明];如int*p[4];2、指向指针的指针定义形式char**p;3、指针数组作main()函数的形参

main(int

argc,char*argv[])10.8有关指针的数据类型和指针运算的小结1有关指针的数据类型的小结2、指针运算的小结3、void指针类型本章的例题需要同学们仔细阅读!第11章结构体与共用体

11.1使用关键字typedef定义新的类型标识符一般形式typedef

类型名标识符;说明(1)“类型名”为已有定义的类型标识符;“标识符”为用户定义的标识符。如:typedef

intINTEGER;

typedeffloatREAL;(2)经此定义后的标识符可作为原数据类型名使用如:INTEGERi,j;REALx,y;11.2结构体一、结构体类型定义的一般形式Struct

结构体名{类型名结构成员名;

……

};说明(1)结构体成员的命名规则与变量相同,并且允许与变量或其它结构体中的成员重名。(2)结构体成员可以是简单类型,数组,指针或已定义过的结构等。如:structstudent{

intnum;charname[20];charsex;

intage;floatscore;charaddr[30];};二、结构体变量、数组、指针的四种说明方式structstudent是自定义的类型名,是结构体类型,用其可以定义变量、数组、指针。(1)紧跟在类型定义之后进行说明如structstudent{……}student1,student2;(2)先定义结构体类型,再单独进行说明如structstudent{……};

structstudentstudent1,student2;(3)定义一个无名结构体类型,直接进行变量说明如struct

{……}student1,student2;(4)用typedef定义一个结构体类型名,再用类型名进行说明。如typedef

struct{intmonth;

……}DATE;DATEbirthday;说明:P262三、对结构体成员的三种引用方式(1)结构体变量名.成员名如student1.num=10010;(2)指针变量名->成员名如p->num=10010;(3)(*指针变量名).成员名如(*p).num=10010;(2)和(3)的前提是:structstudentstudent1,*p;p=&student1;四、给结构体变量、数组赋初值(1)在定义结构时,可以给结构变量、数组赋初值。如P264例11.1P266例11.2(2)给结构体变量赋初值不能跨越前边的成员而只给后面的成员赋值。(3)结构体数组成员赋初值的规则与数组元素赋初值的规则相同。如例11.2五、引用自身的结构体当在一个结构体中有一个成员是指向本结构体类型的指针时,那么通过这样的指针可以把若干个相同的结构体存贮单元连在一起,用以建立如链表、树、图等各种数据结构。如链表结构:如P273图11.10

Struct

c_table{charch;Struct

c_table*next;};C语言的内存动态分配函数(1)malloc(表达式)该函数用来在内存中分配一个指定长度(以字节为单位)的存贮空间,其中表达式的值表示待分配的存贮空间的字节数,返值是指向分配域起始地址的指针,不成功为NULL(空值)其函数原型为

void*malloc(unsigned

intsize);(2)void*calloc(unsigned

num,nusignedsize)该函数用来在内存中分配一块连续的存贮空间,其中num指定需要分配的元素个数;size用来指定每个元素所占的内存空间(以字节为单位),返值是指向分配域起始地址的指针,不成功为NULL(空值)(3)voidfree(void*p)该函数用来释放由malloc或calloc函数分配的存贮空间,其中指针应指向最近一次调用malloc或calloc时所分配存贮区的首地址。对链表的操作:(1)建立链表(2)输出链表(3)链表的插入及删除11.3共用体(联合体)一、共用体定义的一般形式union[共用体名]{类型名共用体成员名;……}[变量名表];说明(1)共用体变量的定义与结构类似,可以把类型定义和变量说明放在一起,也可以分开,还可以直接定义共用体变量而不要共用体名。(2)共用体的含义与结构体不同,共用体中所有成员均放在以同一地址开始的存贮空间中,使用覆盖的方式共享存贮单元,共用体所占空间大小取决于占存贮空间最大的那个成员。(3)共用体变量不能在定义时赋初值。11.3共用体(联合体)二、共用体类型数据的使用(1)不能对共用体变量进行整体操作,只能单独引用其成员(2)共用体成员的引用方式与结构体完全相同(3)共用体变量不能作为函数的参数或函数值,但可以使用指向共用体的指针变量P289(4)共用体可以作为结构成员,结构也可以作为共用体的成员11.4枚举类型一个变量只有几种可能的值,可以定义为枚举类型一、枚举类型的定义和变量说明的两种方式1、定义和说明分开类型定义形式enum

枚举类型名{枚举值1,枚举值2,……,枚举值n};变量说明形式

enum

枚举类型名变量名表;2、直接定义枚举变量一般形式enum

{枚举值1,枚举值2,……,枚举值n}变量名表;说明(1)枚举类型名为用户定义标识符(2)枚举值又称枚举元素、枚举常量,也是用户定义的标识符二、枚举元素和它的序号1、在定义枚举类型的同时,编译程序按顺序给每个枚举元素一个对应的序号,序号的值从0开始,后续元素顺序加12、可以在定义时人为指定枚举元素的序号值,如

enum{sun=7,mon=1,tue,ued,thu,fri,sat}day;没有指定序号值的元素则在前一元素序号值基础上顺序加1三、枚举类型数据的使用1、枚举类型变量的取值范围只限于类型定义时所列出的值2、只能给枚举变量赋枚举值,若赋序号值必须进行强制类型转换,如P2923、枚举值可以进行加(减)一个整数n的运算,用以得到其后(前)第n个元素的值4、枚举值可以按定义时的序号进行关系比较5、枚举值可以按整型输出其序号值第12章位运算

12.1位运算符位运算:指进行二进制位的运算运算符功能优先级结合性~按位取反高左右<<>>左移右移左右&按位与左右^按位异或左右|按位或低左右说明:(1)只有~为单目运算符(2)位运算只能用于整型或字符型数据(3)位运算符可以与赋值运算符结合组成扩展的赋值运算,即~=,<<=,>>=,&=,^=,!=

(4)两个长度不同的数据进行位运算时,系统先将二者右端对齐,然后将短的一方按符号位扩充,无符号数则以0扩充。12.2位运算符的运算规则1、按位取反运算符~单目运算符如~x~x不是求x的负数~1的结果不是-1如~1=?~8=?2、移位运算符>>和<<左边是移位对象,右边是整型表达式,表示移位的位数,左移时低位补0,右移时补符号位,若为无符号整数则补03、按位与运算符&&和&&不同例如:a=10,b=5;可用于“高字节清零,低字节清零”

a&0xffa&0xff004、按位或运算符|如果想使a的低字节全置1则a|0xff如果想使a的高字节全置1则a|0xff005、异或运算符^相同为0不同为1,如果a和b的值相等,则a^b=0,如果想取a中的值并使低位翻转则a^0xff如果使高位翻转则a^0xff0

温馨提示

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

评论

0/150

提交评论