




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Appeared in1972DeveloperBell Labs Dennis Ritchie & Ken Thompson Major implementationsGCC, MSVC, Borland Cn 在C语言诞生以前,系统软件主要是用汇编语言编写的。由于汇编语言程序依赖于计算机硬件,其可读性和可移植性都很差;但一般的高级语言又难以实现对计算机硬件的直接操作(这正是汇编语言的优势),于是人们盼望有一种兼有汇编语言和高级语言特性的新语言。n 语言是贝尔实验室的Ken Thompson和Dennis Ritchie在70年代初研制出来的。80年代初,美国国家标准化协会(ANSI
2、),根据语言问世以来各种版本对语言的发展和扩充,制定了ANSI C标准。n In 1983, Ritchie and Ken Thompson jointly received the Turing Award for their development of generic operating systems theory and specifically for the implementation of the UNIX operating system. Alan Turing, 1912-1954n In 1999, Thompson and Ritchie jointly rece
3、ived the 1998 National Medal of Technology from President Bill Clinton for co-inventing the UNIX operating system and the C programming language which together have led to enormous advances in computer hardware, software, and networking systems and stimulated growth of an entire industry, thereby en
4、hancing American leadership in the Information Age. n会C语法与会用C语言写程序是两个概念nC的灵活性以及由此而产生的陷阱非常非常多nThe most beautiful language and most dangerous language in the programming worldn用变量a给出下面的定义一个整型数一个指向整型数的指针一个指向指针的指针,它指向的指针是指向一个整型数一个有10个整型数的数组一个有10个指针的数组,该指针是指向整型数的n答案 int a; int *a; int *a; int a10; int *a
5、10;void main() int *p; *p=10; typedef struct int data; int index FooData;FooData* foo(int ind)FooData element;element.data = ind+1;element.index = ind;return &element;n 语言简洁、紧凑,使用方便、灵活。共有32个关键字,9种控制语句。n 运算符极其丰富。共有34种运算符。n 数据结构丰富,数据类型有整型,实型、字符型、数组、指针、结构体等。n 具有结构化的控制语句(如ifelse、while、switch、for)n 允
6、许直接访问物理地址,能进行位操作,可以直接操纵硬件。n 生成的目标代码质量高,程序执行效率高。n C语言的关键字共有32个,根据关键字的作用可分为: 数据类型关键字(12个):char, double, enum, float, int, long, short, signed, struct, union, unsigned, void 控制语句关键字(12个):break, case, continue, default, do, else, for, goto, if, return, switch, while 存储类型关键字(4个):auto, extern, register, s
7、tatic 其它关键字(4个):const, sizeof, typedef, volatilen 与其它高级语言一样,语言也是利用函数体中的可执行语句,向计算机系统发出操作命令。按照语句功能或构成的不同,可将语言的语句分为五类。1.控制语句控制语句控制语句完成一定的控制功能。语言只有条控制语句,又可细分为三种:(1)选择结构控制语句:if()else, switch()(2)循环结构控制语句:dowhile(), for(), while(), break, continue(3)其它控制语句:goto, return2. 函数调用语句 函数调用语句由一次函数调用加一个分号(语句结束标志)构
8、成。例如,printf(This is a C function statement.);3. 表达式语句表达式语句由表达式后加一个分号构成。最典型的表达式语句是赋值语句。例如“num=5;”就是一个赋值语句。n 一个完整的语言程序,是由一个main()函数(又称主函数)和若干个其它函数结合而成的,或仅由一个main()函数构成。例 仅由main()函数构成的语言程序。n 1.基本类型 字符型 char 整型 int 浮点型 float 双精度型 double 无值类型 voidn 2.导出类型: 指针、数组、结构、联合、枚举、自定义类型n 数组:相同类型变量的集合,共用一个名字,用下标区别。
9、按照下标递增在内存中连续存放。n 数组元素:数组中的变量。每个元素都属于同一类型。由数组名和下标唯一标识。2004 a0 a1 a2 a920002008内存2036格式类型说明符 数组名常量表达式举例int a10;定义一个数组,数组名a,有10个元素,每个元素的类型均为int。数组长度注意:1. 数组名后是方括号,而非圆括号。从a0开始,没有a10.l数组名遵循标识符的命名规则。l注意使用 l数据类型可以是任何类型,如int,float,charl表示数组长度的常量表达式中不能是变量,只可以是常量和符号常量。定义后不允许改变。C语言不允许动态数组n正确的定义方式 int b2+3; int
10、 c10;n错误的定义方式 int x=10,ax; int a(10); int a1.0;n 数组元素必须先定义,后使用n 不能一次使用整个数组,只能使用元素。n 使用数组元素与使用一般变量方法完全相同。n 形式:数组名下标例如 int a10 ;/10个变量:a0、a1、 a9 scanf(“%d”,&a0); a1=10*a0; printf(“%d”,a1);n 下标不要越界,不能使用a10n (1)对全部数组元素赋初始值 int a5=1,2,3,4,5;a12345 a0 a1 a2 a3 a4n(2)对部分数组元素赋初始值 int a5=1,2,3;n(3)可以省略数组
11、长度,系统自动计算。 int a =1,2,3,4,5; /长度就是5 a12300 a0 a1 a2 a3 a4例: 建立一个存放10个数据的数组,数组元素值为数组元素下标的10倍,然后按正序和逆序输出。010 2090807060504030正序输出逆序输出a a0 a1 a2 a3 a4 a5 a6 a7 a8 a9变量 i 既做 数组下标,又做循环变量;通过循环,逐个处理数组元素 。n int a10,i;n 对于i从0到9循环 ai=10*i;n 对于i从0到9循环 printf(“%d“,ai);n 对于i从9到0循环 printf(“%d“,ai);void main() int
12、 a10 ,i; for(i=0;i10;i+) /*赋值*/ ai=i*10; for(i=0;i=0;i-) /*逆序输出*/ printf(%5d,ai); n 随机访问:counti i=0,1.length-1count0 = 7;counti+1 = counti * 2;+count2;n 错误:数组相互赋值int a5 = 4, 3, 2, 1 ; / 定义数组aint b5 = a;/ 错误,把数组a赋值给数组bn 错误:用数组类型作为函数的参数或返回值 用全局数组或指针替代n 错误:下标越界,小于0或大于length-1,运行时出严重错误,不易发现原因for(i = 0;i
13、0 & index成员名成员名 例例:page = 18; (*指针变量名指针变量名) 成员名成员名 例例:(*p) age = 18 结构体变量访问成员:结构体变量访问成员:stud1.agen struct student *p = NULL; p是指针,指向 struct student类型变量n struct class char *name; /* 班级名称 */ int count;/* 学生数 */;指针作为结构体成员n struct class char *name; int count; student *p; /* 指向学生结构体类型变量的指针作为成员;n 自引用结
14、构,成员是指向同类型变量的指针n struct class char *name; /* 班名字 */ int count; /* 学生数 */ struct class *node; /* 下一个班级 */n struct class 类型的成员 node, 指向一个struct node 类型变量n 三个struct class 类型变量cs1 ,cs2, cs3,组成一个链状n cs1-next = &cs2;n cs2-next = &cs3;n cs3-next = NULL;cs130nextcs228nextcs328next=NULLn 局部的自动变量在栈上分配
15、,函数返回后变量销局部的自动变量在栈上分配,函数返回后变量销毁毁n 在堆上动态的分配内存,整个进程都可见,在手在堆上动态的分配内存,整个进程都可见,在手动释放之前一直存在动释放之前一直存在n 程序根据需要向操作系统申请一块内存程序根据需要向操作系统申请一块内存n 必须在代码里面显式的释放,否则造成内存泄露必须在代码里面显式的释放,否则造成内存泄露n void * malloc(size_t size)头文件stdlib.hsize指定分配内在的大小,以字节为单位返回指向所分配内存的指针分配失败,返回NULL,系统已无可用内存分配成功后,转成我们希望使用的类型void *ptr = malloc
16、( sizeof(int) );int *num = (int *)ptr;分配4个字节,并把分配的内存当作int使用n void free( void *ptr );stdlib.h释放先前动态分配的内存应用程序结束前用free把申请的内存还给系统free( ptr );void Exchg1(int x, int y) int tmp; tmp = x; x = y; y = tmp; printf(x = %d, y = %dn, x, y);main() int a = 4,b = 6; Exchg1(a, b); printf(a = %d, b = %dn, a, b); retu
17、rn(0);输出的结果为:x = _, y=_.a = _, b=_.n 原来,其实函数在调用时是隐含地把实参原来,其实函数在调用时是隐含地把实参a、b 的的值分别赋值给了值分别赋值给了x、y,之后在你写的,之后在你写的Exchg1函数函数体内再也没有对体内再也没有对a、b进行任何的操作了。交换的只进行任何的操作了。交换的只是是x、y变量。并不是变量。并不是a、b。因此。因此a、b的值没有的值没有 改改变!变!n 函数只是把函数只是把a、b的值通过赋值传递给了的值通过赋值传递给了x、y,函,函数里头操作的只是数里头操作的只是x、y的值并不是的值并不是a、b的值。这就的值。这就是所谓的参数的值传
18、递了。是所谓的参数的值传递了。void Exchg3(int &x, int &y) int tmp = x; x = y; y = tmp; printf(x = %d,y = %dn, x, y);main() int a = 4; int b = 6; Exchg3(a, b); printf(a = %d, b = %dn, a, b); return(0);输出的结果为:x=_, y=_.a=_, b=_.n Exchg3函数的定义处Exchg3(int &x, int &y)。参数x、y是int的变量,调用时我们可以像值传递(如: Exchg1(a,
19、 b); )一样调用函数(如: Exchg3(a, b);)。n x、y前都有一个取地址符号“&”。有了这个,调用Exchg3时函数会将a、b 分别代替了x、y了,我们称:x、y分别引用了a、b变量。这样函数里头操作的其实就是实参a、b本身了,也就是说函数里是可以直接修改到a、b的值了。n 在函数定义格式上有不同:在函数定义格式上有不同:值传递在定义处是:Exchg1(int x, int y);引用传递在这义处是:Exchg3(int &x, int &y);n 调用时有相同的格式:调用时有相同的格式:值传递:Exchg1(a, b);引用传递:Exchg3(a, b
20、); n 功能上是不同的:功能上是不同的:值传递的函数里操作的不是a、b变量本身,只是将a、b值赋给了x、y。函数里操作的只是x、y变量而不是a、b,显示a、b的值不会被Exchg1函数所修改。引用传递Exchg3(a, b)函数里是用a、b分别代替了x、y。函数里操作的就是a、b变量的本身,因此a、b的值可在函数里被修改的。 void Exchg2(int *px, int *py) int tmp = *px; *px = *py; *py = tmp; printf(*px = %d, *py = %d.n, *px, *py);main() int a = 4; int b = 6;
21、Exchg2(&a, &b); printf(a = %d, b = %d.n, a, b); return(0);输出的结果为为:*px=_, *py=_. a=_, b=_.n 将a、b的地址值传递给了px、py,而不是传递的a、b的内容。n 对*px、*py的操作当然也就是对a、b变量本身的操作了。所以函数里头的交换就是对a、b值的交换了,这就是所谓的地址传递(传递a、b的地址给了px、py),数组元素做为函数参数数组元素做为函数参数 数组元素就是下标变量,它与普通变量并无区别。 因此它作为函数实参使用与普通变量是完全相同的。 如果是单个数组元素作为函数参数,那前面所讲的
22、三种参数传递方式均可。main() int a5,i; printf(input 5umbersn); for(i=0;i0) printf(%d ,v); else printf(%d ,0);数组名做为函数参数数组名做为函数参数 n 数组名做为函数参数时,并不是将整个数组的元素都传递给子函数,仅仅是将数组的首地址传递。n 由于传递的是数组的首地址,因此在子函数中对数组元素的修改,在子函数返回后依然有效。但不能将此理解为是数组元素的双向传递。数组名做为函数参数数组名做为函数参数 main() int b5,i; printf(initial array bn); for(i=0;i5;i+)
23、 bi = i; nzp(b); for(i=0;i5;i+) printf(%d ,bi);void nzp(int a5) int i; for(i=0;i5;i+) ai = ai+1;数组名做为函数参数要注意以下几点数组名做为函数参数要注意以下几点 n 形参数组和实参数组的类型必须一致,否则将引起错误。形参数组和实参数组的类型必须一致,否则将引起错误。n 形参数组和实参数组的长度可以不相同,因为在调用时,形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度。当形参数组的长度只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出
24、现语法错误与实参数组不一致时,虽不至于出现语法错误(编译能通过编译能通过),但程序执行结果将与实际不符,这是应予以注意的。但程序执行结果将与实际不符,这是应予以注意的。n 在函数形参表中,允许不给出形参数组的长度,或用一个在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。变量来表示数组元素的个数。例如,可以写为: void nzp(int a)或写为 void nzp(int a,int n)n 函数的返回值可以是各种数据类型,如函数的返回值可以是各种数据类型,如int、float、char、指针、数组甚至结构等。但要注意以下几点。指针、数组甚至结构等。但要注意以下几
25、点。int main() int a = 0,b = 0; int c = 0; a = 3; b = 5; c = add_rtVal(a,b); printf(c=%d/n,c); return 1;int add_rtVal(int a,int b) int c = 0; c = a + b; return c;函数中的变量函数中的变量c在函数结束后就销毁不存在了,函数返回在函数结束后就销毁不存在了,函数返回值被赋予了主程序中的变量c,相当于创建了一个副本,不论add()中的局部变量是否销毁都没有关系了。n 函数的返回值如果是指针,键就是要保证在使用这个指针函数的返回值如果是指针,键就是要保证在使用这个指针值的时候,该指针所指向的地方的数据仍然有意义。值的时候,该指针所指向的地方的数据仍然有意义。int main() int *p; int i; p=fun(); for(i=0;i3;i+) printf(%dn,*p); p+; return 0;int* fun(void) int str=1,2,3,4,5; int*q=str; return q;/不能正确返回str是局部变量,函数结束后就销毁了,指向str的指针q所指向的区域就非法了n 函数的返回值如果是指针,键就是要保证在使用这个指针函数的返回值
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 变压器租赁服务3篇
- 供水合同规定供水工程合同3篇
- 充电站数据分析协议3篇
- 企业服务专业合同2篇
- 纸制品行业绿色发展趋势考核试卷
- 电力仪表的数字孪生模型考核试卷
- 胶合板生产场所的应急预案制定考核试卷
- 有色金属压延加工企业品牌建设考核试卷
- 2025-2026年研究和试验开展的核心技术概览
- 2025汽车购买合同简单版协议书
- 水利工程竣工自查报告
- 新疆维吾尔自治区新2024年中考数学模拟试卷附答案
- 2024年中国老年糖尿病诊疗指南解读(2024年版)
- 震后学校维修合同书
- 李白:《将进酒》经典省公开课一等奖全国示范课微课金奖课件
- 19S406建筑排水管道安装-塑料管道
- 教师如何有效地与家长沟通
- 第11课辽宋夏金元的经济社会与文化教学设计-高中历史必修中外历史纲要上册2
- 如何与客户建立有效的沟通
- 真空排水系统施工方案设计
- (完整版)建筑工程技术毕业论文
评论
0/150
提交评论