版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言学习笔记第一章 初识C语言1.1C语言简介:1. C语言允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作,因此,C语言既具有高级语言的功能,又兼容低级语言的许多功能,可以用来编写系统软件。2. 使用标准库函数时,要先包含头文件:stdio.h; 使用数学函数时,要先包含头文件:math.h; 使用字符串函数时,要先包含头文件:string.h; 使用字符函数时,要先包含头文件:ctype.h; 使用产用子程序时,要包含头文件:stdlib.h; 使用调用DOS控制台I/0时,要先包含头文件:conio.h;1.2认识C语言: 1. C程序是由函数构成
2、的。一个C程序至少包含一个main函数,也可以包含一个main函数和若干个其他函数,但须记住!一个C程序中有且只有一个main函数。2. 函数是C程序的基本单位,被调用的函数可以是系统提供的库函数,也可以是用户自己定义的函数。3. 在使用C语言时,习惯上是用英文小写字母书写,当然也可以用大写字母,但是大写字母在C语言中通常作为常量或其他特殊用途来使用。应该注意!C语言中对大小写是有区分的。4. C语言使用”;”号作为语句的结束标志。5. 一个C程序总是从main函数开始执行的,而不管main函数在整个程序中的位置如何。6. 编程时要注意左右大括号要对应使用。7. 变量名、函数名和C语言保留字中
3、间不能加入空格,除此之外的空格和空行可以任意设置,C语言编译系统是不会理会这些空格和空格行符的。8.Visual C+ 6.0集成开发环境的一些快捷键: Ctrl+N: 创建一个新文件 Ctrl+: 检测程序中的括号是否匹配 F7: Build操作 Ctrl+F5: Execute执行操作 Alt+F8: 整理一段不整洁的源代码 F5: 运行调试9. C语言的注释为”/*/”,注释通常用于以下几种情况: 版本、版权声明 函数接口说明 重要的代码行或者段落显示10. 程序中的“”、“”要对齐。11. 空格在程序中的使用: (1)、关键字后要留一个空格。如:const、case等关键字之后要保留一
4、个空格,否则编译器无法辨析它是否是一个关键字。If、for、while等关键字之后也应该留一个空格,然后再跟一个小括号“(”。 (2)、函数名之后不要留空格,要紧跟“(”,以示与关键字的区别。 (3)、“(”后向紧跟,“)” “,” “;”前向紧跟,紧跟处不留空格。 (4)、“,”之后要留空格,如果“;”不是一行的结束,则最后要留空格。 (5)、赋值操作符、比较操作符、算数操作符、逻辑操作符、位操作符,如+、=、<=、*、等二元操作符的前后都应该适当的加空格。对于比较长的表达式,即使是使用了二元操作符,也应该适当的去掉一些空格,使表达式看起来更加紧凑。 (6)、一元操作符如 ! + 等前
5、后都不加空格,如 . ->等操作符,同样前后不加空格。12 要学会适当的换行,换行使代码更清晰。代码行的最大长度应该控制在7080个字符之内。13. 所有的标识符必须由字母或下划线开头,标示符的其他部分可以是字母、下划线或数字组成。大小写字母表示不同的意义,即代表不同的标示符。 14. 标示符不能是关键字。即标示符不能和C语言的关键字相同,也不能和用户已编写的函数或C语言库函数同名。 15. 源程序错误分为3种类型:严重警告、一般错误和警告。第二章 C语言基础2.1 数据类型 1. 数据类型是程序设计语言的基本组成部分,用以说明数据的存储格式、存储空间的占用情况、可表达的数据范围及可施加
6、的运算,在程序中所用到的数据都必须指定它的数据类型。 2. C语言中数据类型包括几个大方向:基本类型、构造类型、指针类型和空类型。如下:数据类型构造类型空类型基本类型指针类型双精度型单精度型长整型基本整型短整型实型(浮点型)枚举类型字符型整型共用体类型结构体类型数组类型 3. 一般一个函数都会有一个返回值,这个返回值应该是具有特定的类型的,我将这个函数定义成什么类型,那么它的返回值就是一个什么样的类型,当然,我也可以进行强制类型转换,将它的返回值的类型变换成其他的类型。2.2 常量1. C语言将数据分为常量和变量,常量就是其值在程序运行过程中不可以改变的量。常量分为以下三大类: 常量字符型常量
7、符号常量实型常量整型常量数值型常量2.2.1 整型常量1. 八进制整数必须以0开头。2. 十六进制整数的前缀为0X或0x。3. 十进制整数没有前缀4. 整型数据在内存中是以二进制的形式存放,数值是以补码表示的。2.2.2 实型常量1. 实型常量也称为浮点型常量,是一个十进制表示的有符号的实数,由整数和小数这两块组成,其中用十进制的小数点进行隔开。2.2.3 字符型常量1 字符型常量可分为两种:一种是字符常量,另一种是字符串常量。2 字符常量中只能够包括一个字符,不是字符串。3 字符常量是区分大小写的。4 所使用的 单撇号代表定界符,这不属于字符常量中的一部分。5 特殊字符常量就是转义字符。它是
8、以反斜杠“”为开头的字符,后面跟一个或几个字符。转义字符中只能使用小写字母,每个转义字符只能看作是一个字符。如果反斜杠之后的字符和它不构成转义字符,则“”不起转义作用,将被忽略。6 使用双撇号括起来的若干字符序列称作字符串常量。空串的长度为0。7 C语言中存储字符串常量时,系统会在字符串的末尾自动加一个“0”作为字符串的结束标志。8 字符常量A与字符串常量“A”是两个不同的概念,主要体现在以下几个方面: (1)、 定界符不同:字符常量使用单撇号,而字符串常量使用的是双撇号。 (2)、长度不同:字符常量的长度固定为1,而字符串常量的长度可以是0,也可以是某个整数,这里的字符串常量“A”的长度是2
9、而不是1。2.2.4 符号常量1. 在C语言中,将程序的常量定义为一个标示符,这个常量就叫做符号常量。2. 通常符号常量使用大写字母表示,符号常量的好处在于可以为编程和阅读带来方便。2.3 变量2.3.1 整型变量1 整型分为有符号和无符号两种,其中短整型(short int)占2个字节,基本整型(int)和长整型(long int)占4个字节。2 如果遇到数据溢出的情况时,编译器并不会报错,但是你得不到你想要的结果,所以说,在编程时,我们要对数据可存储的容量要有足够的了解。2.3.2 实型变量1. 实型变量也称为浮点型变量。实型变量根据实型的精度也可以分为3种,分别是:单精度类型(float
10、 占4个字节)、双精度类型(double 占8个字节)、长双精度类型(long double占8个字节)2. 使用sizeof 运算符能够很容易知道任一种数据类型的长度。如sizeof(int)的值就是一个整型的长度。3. 不同的编译器为变量分配的内存空间不同。2.3.3 字符型变量1. 字符型变量(char)是用来存储字符常量的变量。将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到内存单元中。2. 它存储的形式与整数的存储形式是一样的,所以C语言中允许字符型数据与整型数据之间同用。2.4 运算符与表达式2.4.1 赋值运算符与表达式 1. 在程序中经常
11、遇到的赋值符号“=”就是赋值运算符,其功能是为变量赋值。由赋值运算符所组成的表达式为赋值表达式。 2. 并不是所有的表达式都可以作为左值,如常数,只可以作为右值。 3. 当赋值运算符“=”两侧的类型不一致时,但都是数值型或都是字符型时。在赋值过程中需要进行类型转换。类型转换有两种:一个是自动类型转换,另一个是强制类型转换。 4. 自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成,转换按数据长度增加的方向进行,以保证精度不降低。 5. 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精
12、度,丢失的部分按照四舍五入向前舍入。 6. 当高级别的精度向低级别的精度方向进行强制类型转换时,可能会出现数据丢失。这个时候可能会编译成功,但是得不到我们想要的精确的结果。 7. 无论是强制类型转换还是自动类型转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,并不改变数据的原始类型。 8. 在赋值符“=”之前加上其他的运算符,可以构成复合的运算符。如“+=”,“*=”等。2.4.2 算术运算符与表达式1. 算术运算符包括两个单目运算符正和负,5个双目运算符: + - * / % .2. 求余运算符(模运算符)“%”, 为双目运算符,要求参与运算的量均为整型,求余运算的结果等于两
13、数相除后的余数。3. 用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子称为算术表达式。运算对象包括常量、变量及函数等。2.4.3 关系运算符与表达式1. “关系运算”实际上是“比较运算”,关系运算符也就是比较两个操作数大小的符号。C语言中提供了六种关系运算符,它们是:> >= < <= = != .2. 关系表达式的值是一个逻辑值,即“真”或“假”。2.4.4 逻辑运算符与表达式1. 逻辑运算符是指用形式逻辑原则来建立数值间关系的符号。C语言中提供了3中逻辑运算符:&& | ! 。2. 逻辑表达式的值应该是一个逻辑量“真”或“假
14、”。在C语言中,表达式的值非0,那么其值为真。非0的值用于逻辑运算,则等价于1;假值总是0。2.4.5 逗号运算符与表达式1. C语言中逗号“ , ”也是一种运算符,称为逗号运算符。其优先级别最低,结合方向自左至右。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。该表达式的最终结果是最后那个表达式n的值。2.4.6 三目运算符与表达式1. C语言中唯一的三目运算符:条件运算符“?”,它的一般形式为: 表达式1 ? 表达式2 :表达式3;在运算中,首先对第一个表达式的值进行检验。如果为真,返回第二个表达式的结果值;如果为假,则返回第3个表达式的结果值。2. 在平时编程的时候我们得注意
15、:需要仔细辨别“= =”和“=”的区别。前者是关系运算符,后者是赋值运算符。ASII码值在6590之间,字符为大写字母:ASII码值在97122之间,字符为小写字母:ASII码值在4857之间,字符为数字:ASII码值不在上面的3个任意的范围内,字符是特殊字符。第三章 顺序与选择结构程序设计3.1 C语句及赋值语句1. C语句分为5类:表达式语句、函数调用语句、空语句、控制语句和复合语句。2. 在编写程序时,声明部分不能算作语句。3. 分号预示着一条语句的结束,但并不是每条C语言语句都需要分号作为结束的标志,If语句、for语句以及while语句并不需要分号,但如果不小心写了分号,编译器并不会
16、提示错误,因为编译器会将其当成空语句进行执行。这点千万要小心!4. C语言中的9种控制语句:(1)、 条件判断语句:如if语句和switch语句。(2)、 循环执行语句:do while语句、while语句和for语句。(3)、 转向语句,break语句、goto语句、continue语句和return语句。 5. 复合语句中定义的标识符只有在此复合语句(大括号)中有效,因此被称为块级声明。 6. 在应用中要注意赋值表达式和赋值语句的概念的不同,赋值表达式可以包含在其他表达式中。 7. 在变量说明中,不允许连续给多个变量赋初值,如:int a=b=c=5; 这样写就是错误的,必须写成:int
17、a=5, b=5, c=5;而赋值语句允许连续赋值:如a=b=c=5 是可以的。 3.2 字符数据输入/输出3.2.1 字符数据输出 1. 字符数据输出的是:putchar函数,作用是向显示设备输出一个字符。该函数的定义为: int putchar(int ch); 如putchar(A);2. 字符数据输入的是:getchar函数,作用是从终端(输入设备),输入一个字符。getchar函数与putchar函数不同的是没有参数。该函数的定义为: int getchar(); 如:cChar=getchar();3. 需要注意的是:getchar只能接收一个字符,getchar函数得到的字符可以
18、赋给一个字符变量或整型变量,也可以不赋给任何变量,还可以作为表达式的一部分,如 putchar(getchar();3.3 格式输入/输出函数3.3.1 格式输入函数1. printf 函数的一般格式: printf(格式控制, 输出列表)格式控制可由格式字符串和非格式字符串两种组成。格式子字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的格式、形式、长度、小数位数等。非格式字符串也就是通常所说的普通字符,即在输出时原样输出。2. 常用的格式字符有以下几种:(1)、 %d:按整型数据的实际长度输出。(2)、 %md: m为指定的输出字段的宽度。如果数据的位数小于m,则在左端补
19、以空格,若大于m,则按实际位数输出。(3)、 %ld: 输出长整型数据。(4)、 %o: 按整型数据的八进制的实际长度输出。(5)、 %x: 按整型数据的十六进制的实际长度输出。(6)、 %u: 以十进制形式输出无符号型数据。(7)、 %c: 用来输出一个字符。(8)、 %s: 将字符串按实际长度输出。(9)、 %ms: 输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若字符串长度小于m,则左补空格。(10)、%-ms:右补空格。(11)、%m.n: 输出占m列,但只取字符串中左端的n个字符。这n个字符输出在m列的右侧,左补空格。若是m的值小于n,则m自动取n值。
20、3.3.2 格式输入函数 1. scanf函数的一般格式: scanf(格式控制, 地址列表)scanf函数与printf函数的不同之处在于:格式控制中不能显示费格式字符串(即普通字符)。 2. 地址列表中给出给变量的地址,地址是由地址运算符“&”后跟变量名组成的。(有两个例外是不要跟&符号的,一个是当地址列表中有数组时,一个数组名即表示了该数组的首地址;另外,当地址表中有指针时。)不过,说到底,地址列表中就是要让你把变量的地址说出来,不管带不带“&”符号,目的只有一个:把变量的地址正确的表示出来。 3. 当格式控制中出现“%d,%d”时,即两个%d之间用逗号隔开,这时
21、输入的数据之间必须用逗号隔开,除此之外用其他字符隔开均会产生错误。如果格式控制中出现“%d%d”时,即两个%d之间无任何符号,这时输入的两个数据之间可以一个或多个空白字符作为间隔,这些空白字符包括空格、换行、制表符(Tab),除此之外用其他字符间隔均会产生错误。3.4 If语句3.4.1 if语句的基本形式 1. if语句通过对表达式进行判断,然后根据判断的结果选择是否进行相应的操作,其一般形式为: If(表达式) 语句;其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。 2. 多分支if语句的一般形式: If(表达式1) 语句1 else if(表达式2) 语句2 else
22、if(表达式3) 语句3 else 语句n 3. 在if语句中又包含一个或多个if语句称为if语句的嵌套。 3.5 switch语句 1. switch语句的一般形式为:switch(表达式) case 常量表达式1: 语句块1; case 常量表达式2: 语句块2; case 常量表达式n: 语句块n; default : 默认情况语句块; 2. 每个case的常量表达式的值必须互不相同,否则就会出现相互矛盾的现象。在执行一个case分支后,如果想使流程跳出switch结构,即终止switch语句的执行,可以在相应的语句后加break来实现。最后一个default可以不加break语句。第四
23、章 循环控制4.1 while及do while语句4.1.1 while语句 1. while是C语言中的关键字,while(表达式)中的表达式,可以是C语言中任何符合标准的表达式,而且循环体是否会得到执行,由表达式决定。4.2 for语句4.2.1 for循环的变体1. for循环的3个语句之间必须要用分号隔开。2. for语句中第一个表达式的作用是对循环变量设置初值。因此,如果省略了表达式1,就会跳过这一步操作,则应在for语句之前给循环变量赋值。如果省略了表达式1,表达式1后的分号不可以省。3. 如果表达式2省略,即不判断循环条件,循环无终止的进行下去。也就是默认表达式2始终为真。4.
24、 表达式3也可以省略,但此时程序设计人员应该另外设法保证循环能正常结束,否则程序会无终止循环下去。4.3 转移语句4.3.1 goto语句1. goto语句也称为无条件转移语句,其一般形式为:goto 语句标号;例如: goto Show; Printf(“the message before ShowMessage”); Show: Printf(“ShowMessage”);2. goto语句有两个用途:(1)、与if语句一起构成循环结构。 (2)、从循环体重跳转到循环体外。3. C语言不限制程序中使用标号的次数,但各标号不得重名。Goto语句的语义就是改变程序流向,转去执行语句标号所标识
25、的语句。4.3.2 break语句 1break语句不能用于switch语句和循环语句之外的任何其他语句。4.3.3 continue语句 1. continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不在判断执行循环的条件是否成立。第五章 数组51 一维数组5.1.1 一维数组的定义和引用 1. 数组必须先定义后使用,可以通过引用数组元素的方式,使用该数组中的元素。 2. 在定义数组类型的时候,其类型可以是任意一种简单类型、构造类型或是指针。 3. 在定义数组时,可直接对全部的数组元素赋值,即全部初始化
26、。 4. 可以只给一部分元素赋值,当“”中的值得个数少于元素个数时,只给前面部分元素赋初值,没有赋值的元素默认值为0。 5. 在对全部数组元素赋初值的时候,可以不指定数组长度。 例如: int a =10, 20, 30,40,50; 6. 在数组中千万要注意下标越界的问题。如:定义了数组 a4,只能引用其数组中的a0、a1、a2、a3,不能引用a4,这一点千万要注意!5.2 二维数组1. 二维数组的定义和一维数组类似,只是比一维数组多了一个常量表达式。5.3 字符数组 1. 字符数组的定义与其他数据类型的数组定义类似,其一般形式为: char 数组名常量表达式;2. 通常用一个字符数组来存放
27、一个字符串。3. 在C语言中,使用字符数组保存字符串,即用一个一维数组保存字符串中的每一个字符。字符串总是以“0”作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符“0”存入数组,并以此作为该字符串是否结束的标志。系统会自动在字符串的末尾为其添加“0”作为结束符,不必手动填写。4. 格式符“%C”,实现字符数组中字符的逐个输入与输出。5. 格式符“%S”,实现字符数组中字符串的整串输入输出。6. 在程序中有时候会有这样的一个语句:scanf(“%S”,array);这里的array是字符数组名,前面没有“&”,C语言中规定数组名代表该数组的起始地址。如果在前面加了&,
28、反而不对了。7. puts函数,用于字符串输出,puts函数的格式如下:puts(字符数组名);8. gets函数,用于从终端(键盘等)输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。其格式如下: gets (字符数组名);9. strcat函数,用于字符串连接。其函数的格式如下: strcat(字符数组名1,字符数组名2);10. 在使用strcat函数时要注意,字符数组1的长度要足够的大,否则不能装下连接后的字符串。11. strcpy函数,用于字符串复制,其格式如下: strcpy(字符数组名1,字符数组名2); 该函数的功能就是把字符数组2的字符串复制到字符数组1中,串结
29、束标志“0”也一同复制。12. 在使用puts函数和gets函数时,每次只能输入或输出一个字符串,不能用逗号分隔符进行多个字符串的输入或输出。例如:puts(str1,str2);就是错误的。13. strcmp函数,用于字符串比较,其格式如下:strcmp(字符数组名1,字符数组名2);其功能是:按照ASII码顺序比较连个数组中的字符串,并由函数返回值比较结果。其返回值如下:字符串1=字符串2,返回值为0;字符串1>字符串2,返回值为一正数;字符串1<字符串2,返回值为一负数;当两个字符串进行字符串比较时若出现不同的字符,则以第一个不同的字符的比较结果作为整个比较的结果。14.
30、strlen函数,用于测试字符串长度。其格式如下:strlen(字符数组名);其功能是:测字符串的实际长度(不含字符串结束标志“0”),函数返回值为字符串的实际长度。15. strlwr函数,用于将字符串转换成小写字母。其格式如下:strlwr(字符串);其功能是:将字符串中的大写字母变成小写字母,其他字母不变。16. strupr函数,用于将字符串转换成大写字母。其格式如下:strupr(字符串数组名);其功能是:将字符串中小写字母变成大写字母,其他字母不变。第六章 函数6.1 函数的简介1. 每个C程序的入口和出口都是位于main函数之中。2. C程序中所有的函数都是平行的,即在定义函数时
31、是互相独立的,在一个函数中不能嵌套定义另外一个函数,函数间可以相互调用,但main函数不能被调用。3. 一个源文件由一个或多个函数组成,一个源程序文件是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。4. 库函数由C系统提供,用户无需定义,在函数之前也不必在程序中作类型说明,只需在程序前包含该函数原型的头文件即可在程序中直接调用。5. 按照函数定义可以分为库函数和自定义函数。6. 按照函数结果可分为有返回值函数和无返回值函数。7. 按照函数的数据传递可分为有参函数和无参函数。8. 在程序中编写函数时,函数的定义是让编译器知道函数的功能。函数一般包括用户自己定义和系统提供的标
32、准库函数两种。9. 如果将函数的定义放在调用函数之前,那么就不需要进行函数的声明,此时函数的定义就包含了函数的声明。如果想在调用之后再定义函数,那么,在调用之前必须先对函数进行声明。10. 定义和声明最大的区别是:定义创建了对象,并给对象分配内存;声明没有为对象分配内存。6.2 返回语句 1. 返回语句有两个主要的用途: (1)、返回语句能立即从所在的函数中退出,即返回到调用的程序中去。 (2)、返回语句能返回值。返回值的类型取决于你定义这个函数时的类型,如果给函数定义的是整型,那么你将会得到一个整型的返回值;如果你定义的是一个指针类型,那么你将得到一个指针类型的返回值,即一个地址。 3. 如
33、果程序没有返回值,可以利用return语句来结束函数的调用流程。6.3 函数参数1. 在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系,函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体的操作处理。2. 形参变量只有在被调用时才分配内存单元,在调用结束时,会释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。3. 实参可以是常量、变量、表达式和函数等,不论是什么类型的量,只要是实参,在函数进行调用时,这个类型变量必须具有确定的值,以便把这些值传递给形参。为了避免发生“类型不匹配”的错误,实参和形参的类型、数量、书写顺
34、序等都必须保持一致。4. 无论实参是什么,只要是传递给了形参,那么你形参在你的函数里就尽管用就可以了,比如说,实参给形参传递过去了一个数组,那么你就按照数组的使用规则来有这个形参就可以了。如果实参是一个地址,那么就按指针的使用规则来用就可以了。5. C语言规定,实参变量对形参变量的数值传递时单向传递,即只能由实参传给形参,而不能由形参在传给实参。6. 在C语言中,没有任何下标的数组名就是一个指向该数组第一个元素的指针,其中的代码没有下标的数组名array与指向第一个元素的指针*array是相同的。6.4 函数的调用1. 如果自定义函数在主函数的前面时,就不需要在引用头文件后在进行声明,如果自定
35、义函数在主函数的后面时,就需要在引用头文件时进行提前声明。2. 递归函数又称为自调用函数,C语言的函数都支持递归,也就是说,每个函数都可以直接或间接调用自己。6.5 局部变量和全局变量1. 在一个函数的内部定义的变量是局部变量。在语句块内声明的变量仅在该语句块内部起作用,当然也包括嵌套在其中的子语句块。2. 在C语言中位于不同作用域的变量可以使用相同的标识符,也就是说可以为变量起相同的名字。在内外层作用域中若是有相同的变量名时,此时内层作用域中的变量将会屏蔽外层作用域中的那个变量,知道结束内层的作用域为止。3. 全局变量就是可以再程序中的任何位置进行访问的变量。全局变量不属于某个函数,而是整个
36、源文件。但是如果外部文件要进行调用,需要使用extern进行引用修饰。4. 定义全局变量的作用是增加了函数间数据联系的渠道。6.6 变量的存储类别1. 变量的存储类别分为两种形式,动态存储和静态存储。2. auto 变量: C语言规定,函数内凡未加存储类型说明的变量均视为自动变量,也就是说自动变量可省去说明符“auto”。自动变量的作用域仅限于定义该变量的个体内。在函数中定义的自动变量,只有在该函数内有效。在复合语句中定义的自动变量只有在该复合语句中有效。自动变量属于动态存储方式,只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,函数调用结束,释放存储单元。3. 由于自动变量的作用域
37、和生存期都局限于定义它的个体内(函数或复合语句内),因此不同的个体中允许使用同名的变量而不会混淆。即使在函数内定义的自动变量也可与该函数内部的复合语句中定义自动变量同名。4. static 变量: 静态局部变量属于静态存储类别。在程序整个运行期间都不释放,它的生存期为整个源程序。静态局部变量的作用域与自动变量相同,即只能在定义该变量的函数内使用该变量。退出函数后,尽管该变量还存在,但不能使用它,如再次调用定义其函数,又可以继续使用。5. 对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值,而对自动变量不赋初值,则其值是不确定的。这就是我们在编写程序时,往往忘记给auto类型的变量
38、赋初值,系统则给它随意赋了一个值,而结果呢?却总是得不到我们想要的结果。6. register 变量(寄存器变量):通常变量的值是存放在内存中,当对一个变量频繁读写时,则需要反复访问内存储器,从而花费大量的存取时间。为了提高效率,C语言提供了另一种变量,即寄存器变量。这种变量允许将局部变量的值存放在cpu中的寄存器中,使用时不需要访问内存,而直接从寄存器中读写,这样就加快了程序执行的速度。6.7 内部函数和外部函数1. 定义一个函数,如果希望这个函数只被所在的源文件使用,称这样的函数为内部函数。内部函数又称为静态函数。如果在不同的源文件中有同名的内部函数时,这些同名的函数是互不干扰的,在定义内
39、部函数时,要在函数返回值和函数名前面加上关键字static进行修饰。2. 使用内部函数的好处是,不同的开发者可以分别编写不同的函数,而不必担心所使用的函数是否会与其他源文件中的函数同名,因为内部函数只可以在所在的源文件中进行使用,所以即使不同源文件有相同的函数名字也没有关系。3. 与内部函数相反的是外部函数,外部函数就是可以被其他源文件调用的函数。定义外部函数使用关键字extern进行修饰。4. C语言定义函数时,如果不指明函数是内部函数还是外部函数,那么默认将函数指定为外部函数。也就是说,定义外部函数时,可以省略关键字extern。6.8 库函数6.8.1 数学函数1. abs 函数:该函数
40、的功能是求整数的绝对值,参数x是所要求的绝对值得整数。该函数的定义形式如下: int abs(int x);2. labs 函数: 该函数的功能是求长整数的绝对值,定义形式如下: long labs(long x);3. fabs 函数: 该函数的功能是求浮点数的绝对值,定义形式如下: double fabs(double x);4. sin 函数:该函数的功能是返回参数x的正弦值,定义形式如下: double sin(double x); 这里的x用弧度表示。5. cos函数:该函数的功能是返回参数想的余弦值,定义形式如下: double cos(double x); 这里的x用弧度表示。6
41、. tan函数6.8.2 字符和字符串函数 1. isalpha 函数,该函数的功能是检测字母,如果参数(ch)是字母表中的字母(大写或小写),则返回非0。要包含头文件ctype.h。函数定义如下: int isalpha(int ch);2.isdigit 函数,该函数的功能是检测数字,如果参数是数字则返回非0值,否则返回0值。要包含头文件ctype.h。函数定义如下: int isdigit (int ch);3. isalnum 函数,该函数的功能是检测字母或函数,如果参数是字母表中的一个字母或是一个数字,则函数返回非0值,否则返回0值。要包含头文件ctype.h。4. strchr 函
42、数,该函数的功能是返回由str所指向的字符串中首先出现ch的位置指针,如果未发现与ch匹配的字符,则返回空指针。函数的原型在string.h中。函数定义如下: char *strchr(char *str, char ch); 例如: char s20; Char *p, c=u; Strcpy(s, ”good luck to you”); P=strchr(s, c);5. modf 函数 ,函数的定义为:double modf(double num, double *i);该函数的作用是把num分解成整数部分和小数部分,该函数的返回值为小数部分,把分解出的整数部分存放到由i所指的变量中。
43、该函数的原型在math.h中。例如: float number=3.141592; Double f, i; f = modf(number, &i);其结果为:f=0.141592 i=3 。6. pow 函数,该函数的定义为:double pow(double base, double exp);该函数的作用是计算以参数base为底的exp次幂。Pow函数的原型在math.h中。例如:int x=2,y=3,m; m=pow(2, 3); 则 m的值为 8。 7. sqrt 函数,该函数的一般形式为: double sqrt(double num); 该函数的作用是返回参数num的
44、平方根。第七章 指针7.1 指针的相关概念 1. 在C语言中,存取变量值的方法有两种,按变量地址存取变量值得方式称为“直接访问”方式;将变量地址存放在另外一个变量中,先找大存放“变量地址”的另一个变量,通过另一个变量找到变量的地址,这种方法称为“间接访问”。 2. 变量的地址是变量和指针两者之间的纽带,如果一个变量包含了另一个变量的地址,那么,第一个变量可以说成是指向第二个变量。 3. 在程序代码中,是通过变量名来对内存单元进行存取操作的,但是代码经过编辑后已经将变量名转换为该变量在内存的存放地址,对变量值的存取都是通过地址进行的。 4. 地址可以形象地称之为指针,意思是通过指针能够找到内存单
45、元。 5. 一个变量的地址称为该变量的指针。 6. C语言中有专门用来存放内存单元地址的变量类型,就是指针类型。 7. 给指针变量所赋的值与给其他变量所赋的值不同,给指针变量的赋值只能赋予地址。而不能赋予任何其他数据,否则将引起错误。 8. * 符号代表的是一个指针类型,*p 则能够指向一个具体的地址,该地址里装有一个数据,所以说*P 其实就是一个真实的数据。而& 符号则代表的是一个地址,仅仅是一个地址,它不能表示一个具体的数据。“&”是一个返回操作数地址的单目运算符,叫做取地址运算符。 9. 指针有加法和减法两种算术运算,即指针的自加和自减运算,这不同于普通变量的自加自减运算
46、,也就是说它并不是简单的加1减1.指针都按照它所指向的数据类型的直接长度进行增或减,除了加减运算外,指针不能做乘法、除法等其他运算。 7.2 一维数组与指针1. 对于数组来说,数组名就是数组在内存中存储的首地址。指针变量用于存放变量的地址,自然也可以存放数组的首地址或数组元素的地址,这样就给数组和指针之间建立了一个联系。2. 在将数组名赋给指针变量时不需要写“&”,但是再将数组首地址赋给指针变量时需加上“&”。例如: int *p , a5; p=a; 与 int *p ,a5; p=&a0; 是具有完全相同的效果。3. 对于一维数组的引用有两种方法:一种是下标法,另一
47、种是指针法。4. *(p+n), 随着n的变化,可以用来表示数组中的各元素。7.3 二维数组与指针 1. &a00 皆可以看作是数组0行0列的首地址,同样还可以看作是二维数组的首地址。&amn就是第m行n列元素的地址。 2. a0+n , 表示第0行第n个元素地址,同理,am+n,表示的是第m行第n列个元素的地址。 3.*(*(a+n)+m) 表示第n行第m列元素。 4. *(an+m)表示第n行第m列元素。 5. 利用指针引用二维数组关键要记住*(a+i)与ai是等价的。7.4 字符串与指针1. 将字符数组的名赋予一个指向字符类型的指针变量,让字符类型指针指向字符串在内存的首
48、地址,对字符串的表示就可以用指针实现。2. 字符型指针就是指向字符内存空间的指针变量,其一般形式为:char *p :使用字符型指针就可以访问字符串。3. 字符串数组有别于字符数组,字符数组是一个一维数组,而字符串数组是以字符串作为数组元素的数组,可以将其看成是一个二维字符数组。7.5 指针作函数参数1. 我们知道整型变量,实型变量,字符型变量、数组名和数组元素等都可以作为函数的参数,同理,指针型变量同样也可以作为函数的参数。2. 在主函数中,若将两个变量的地址作为函数的实参传递个被调用的函数是,该被调用的函数必须得定义两个指针变量的形参,用来接收这两个实参。因为指针可以形象地称之为地址,并且
49、在函数一章中我们知道:实参和形参的类型必须得是相符合的,否则就不能进行值的传递。所以在很多时候,实参往往是一些地址,而形参则往往 是一些指针。3. 在调用函数中,无论我们传递过去了什么样的值,只要你的形参接住了,你就按照这种数据类型的规则来使用就可以了,不必顾虑什么。比如说:当你形参接收到了一个数组的首地址时,即此时你形参是一个指针类型时。你就按照指针类型的使用规则来使用这个数据就可以了。7.6 指向指针的指针1. 当指针变量用于指向指针类型变量时,称之为指向指针的指针变量。例如: int *p; 7.7 函数型指针1. 指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址,该函数
50、的入口地址就称之为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。2. 一个函数可以带回一个整型值、字符值、实型值等,也可以带回一个指针型的数据,即地址。比如说: int *fun(int x, int y); 这样的函数返回的值就是一个指针型的数据。第八章 结构体与共用体8.1 结构体1. 结构体是一种构造类型,它是由若干个“成员”组成的。其中每一个成员可以是一个基本数据类型或者是一个构造类型。2. 同样是存放一组数据,结构体与数组的区别在于:数组中要求各元素的类型和长度都必须一致。而结构体则没有这么要求,它其中的成员可以是各种不同的类型,长度也可以不一样。3. 声明一
51、种结构体的一般形式: Struct 结构体名 成员列表; ;4. 在声明结构时,要注意大括号最后面有一个分号“;”,在编写时千万不要忘记。另外,关键字 struct 不可以省略。5. 声明一种结构体表示的是创建一种新的类型,我们创建一种新的类型的最终目的还是要用新的类型名再进行定义变量。定义的方式有3种:(1)、 先声明结构体类型,再定义变量。此时,关键字strcut 必须与结构体名一起使用才能定义该结构体类型的变量。(2)、 在声明结构类型时,同时定义变量。定义的变量不是只能有一个,可以定义多个变量。(3)、 直接定义结构体类型变量。 6. 结构体类型和变量是不同的概念,不能混为一谈。程序员
52、只能对变量进行相应的运算,不能对结构体类型进行运算。例如:使用int型定义变量a ,可以为a进行赋值,但是不能为int进行赋值。 7. 结构体类型中的成员相当于变量的作用。 8. 结构体中的成员变量也可以是另外一个结构体。 9. 在引用结构体类型变量时,我们得注意:不能直接将一个结构体变量作为一个整体进行输入和输出。 10. 在引用结构体的成员时,可以在结构体变量名的后面加上成员运算符“.”和成员的名字。如果成员的本身就是一个结构体类型时,这时就要使用若干个 成员运算符,一级一级的找到最低一级的成员。 11. 成员运算符“.”的优先级最高。 12. 在初始化结构体变量时,定义的变量后面使用等号
53、,然后将其初始化的值放在大括号中,并且每一个数据要与结构体成员列表的顺序一样。 13. 只有在初始化时才可以对结构体变量整体赋值,除此之外只能分别给每个成员赋值,但不可以在结构体内部给结构体变量的每个成员赋值。 8.2 结构体数组1. 数组的类型可以是整型、实型、字符型等,同样数组的元素也可以是结构体类型,因此可以构成结构体类型数组。2. 定义一个结构体数组的方式与定义结构体变量的方法相同,只是将结构体变量替换成数组。8.3 结构体指针1. 使用指向结构体变量的指针访问成员的方法有一下两种:(1)、使用点运算符引用结构体成员。 例如: struct Student *pStruct; (*pStruct).成员名 这其中*pStruct 一定要使用括号,因为点运算符的优先级是最高的,如果不使用括号,就会先执行点运算然后再执行“*”运算。(2)、 使用指向运算符引用结构体成员。 例如:struct Student *pStruct; pStruct->成员名; 这其中,我们得注意了,如:pStruct->iGrade+表示指向的结构体变量中成员iGrade的值,使用该值后再加1。而+pStruct->iGrade则是表示指向的结构体变量中成员iGrade的值加1,计算后在进行使用。2. 结构体指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年重庆建筑科技职业学院单招职业技能笔试备考题库带答案解析
- 2026年黄山职业技术学院高职单招职业适应性测试参考题库带答案解析
- 2026年淄博职业学院单招职业技能考试备考题库带答案解析
- 2026年铜仁职业技术学院高职单招职业适应性考试模拟试题带答案解析
- 2026年南阳职业学院单招职业技能笔试备考试题带答案解析
- 2026年珠海城市职业技术学院高职单招职业适应性测试备考试题带答案解析
- 2026年盘锦职业技术学院单招职业技能笔试备考试题带答案解析
- 2026年应天职业技术学院高职单招职业适应性测试备考题库带答案解析
- 2026年上海建桥学院单招职业技能考试备考题库带答案解析
- 2026年江西生物科技职业学院单招综合素质考试备考试题附答案详解
- 2026年消防设施操作员之消防设备基础知识考试题库500道及完整答案(各地真题)
- 2026年电信运营商物资管理岗位面试题
- 2025年高职会计(成本核算)试题及答案
- 虫鼠害培训课件
- 2025年5年级期末复习-苏教版丨五年级数学上册知识点
- 2025年韩家园林业局工勤岗位工作人员招聘40人备考题库及参考答案详解一套
- 工会工作考试题库
- 2025学年上海市七年级语文上册作文题目汇编及解析
- 2026年河南经贸职业学院单招职业技能测试题库及参考答案详解
- 焊接机器人变位机技术设计方案
- 搅拌桩机使用说明书
评论
0/150
提交评论