零基础学C语言 从入门到精通 视频教程 程序设计基础 新手学C语言入门教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C讲义
目录
1愉快的开始-HELLO WORLD (14)
1.1INCLUDE头文件包含 (14)
1.2MAIN函数 (14)
1.3注释 (14)
1.4{}括号,程序题和代码块 (14)
1.5声明 (14)
1.6C语言自定义名字的要求 (15)
1.7PRINTF函数 (15)
1.8RETURN语句 (15)
1.9S YSTEM系统调用 (15)
1.9.1System返回值在windows和unix下的不同, (15)
1.9.2POSIX (15)
1.10C语言编译过程,GCC参数简介 (16)
1.10.1C语言编译过程 (16)
1.10.2-E预编译 (16)
1.10.3-S汇编 (16)
1.10.4-c编译 (16)
1.10.5链接 (16)
1.11操作系统结构 (17)
1.11.1用户模式 (17)
1.11.2内核模式 (17)
1.12.1CPU内部结构与寄存器 (18)
1.12.2RISC与CISC CPU构架 (18)
1.12.3SPARC,x86与ARM (18)
1.13汇编语言 (18)
1.13.1I386汇编简介 (18)
1.13.2VS反汇编 (19)
1.14IDE工具 (19)
1.14.1QT常用快捷键 (19)
1.14.2VS常用快捷键 (19)
1.14.3VS断点,调试 (19)
2C语言中的数据类型 (19)
2.1常量 (19)
2.1.1#define (19)
2.1.2const (19)
2.2字符串常量 (20)
2.3二进制数、位、字节与字 (20)
2.4八进制 (20)
2.5十六进制 (20)
2.6原码 (21)
2.7反码 (21)
2.8补码 (21)
2.10INT类型 (22)
2.10.1int常量,变量 (22)
2.10.2printf输出int值 (23)
2.10.3printf输出八进制和十六进制 (23)
2.10.4short,long,long long,unsigned int (23)
2.10.5整数溢出 (23)
2.10.6大端对齐与小端对齐 (23)
2.11CHAR类型 (24)
2.11.1char常量,变量 (24)
2.11.2printf输出char (24)
2.11.3不可打印char转义符 (24)
2.11.4char和unsigned char (25)
2.12浮点FLOAT,DOUBLE,LONG DOUBLE类型 (25)
2.12.1浮点常量,变量 (25)
2.12.2printf输出浮点数 (25)
2.13类型限定 (25)
2.13.1const (25)
2.13.2volatile (26)
2.13.3register (26)
3字符串格式化输出和输入 (26)
3.1字符串在计算机内部的存储方式 (26)
3.2PRINTF函数,PUTCHAR函数 (27)
3.3SCANF函数与GETCHAR函数 (28)
4运算符表达式和语句 (29)
4.1基本运算符 (29)
4.1.1= (29)
4.1.2+ (29)
4.1.3– (29)
4.1.4* (29)
4.1.5/ (29)
4.1.6% (29)
4.1.7+= (29)
4.1.8-= (29)
4.1.9*= (29)
4.1.10/= (30)
4.1.11%= (30)
4.1.12++ (30)
4.1.13-- (30)
4.1.14逗号运算符 (30)
4.1.15运算符优先级 (30)
4.2复合语句 (31)
4.3空语句 (31)
4.4类型转化 (31)
5.1关系运算符 (31)
5.1.1< (31)
5.1.2<= (31)
5.1.3> (32)
5.1.4>= (32)
5.1.5== (32)
5.1.6!= (32)
5.2关系运算符优先级 (32)
5.3逻辑运算符 (32)
5.3.1&& (32)
5.3.2|| (32)
5.3.3! (33)
5.4IF (33)
5.5IF ELSE (34)
5.6IF ELSE IF (34)
5.7SWITCH与BREAK,DEFAULT (35)
5.8条件运算符? (36)
5.9GOTO语句与标号 (36)
6循环语句 (36)
6.1WHILE (36)
6.2CONTINUE (37)
6.4DO WHILE (37)
6.5FOR (37)
6.6循环嵌套 (37)
7数组 (38)
7.1一维数组定义与使用 (38)
7.2数组在内存的存储方式 (38)
7.3一维数组初始化 (38)
7.4二维数组定义与使用 (39)
7.5二维数组初始化 (39)
8字符串与字符数组 (39)
8.1字符数组定义 (39)
8.2字符数组初始化 (39)
8.3字符数组使用 (40)
8.4随机数产生函数RAND与SRAND (40)
8.5用SCANF输入字符串 (40)
8.6字符串的结束标志 (41)
8.7字符串处理函数 (41)
8.7.1gets (41)
8.7.2fgets函数 (41)
8.7.3puts函数 (42)
8.7.4fputs函数 (42)
8.7.5strlen,字符串长度 (42)
8.7.6strcat,字符串追加 (42)
8.7.7strncat,字符串有限追加 (43)
8.7.8strcmp,字符串比较 (43)
8.7.9strncmp,字符串有限比较 (43)
8.7.10strcpy字符串拷贝 (43)
8.7.11strncpy字符串有限拷贝 (43)
8.7.12sprintf,格式化字符串 (43)
8.7.13Sscanf函数 (44)
8.7.14strchr查找字符 (44)
8.7.15strstr查找子串 (44)
8.7.16strtok分割字符串 (44)
8.7.17atoi转化为int (45)
8.7.18atof转化为float (45)
8.7.19atol转化为long (45)
9函数 (45)
9.1函数的原型和调用 (45)
9.2函数的形参与实参 (45)
9.3函数的返回类型与返回值 (46)
9.4MAIN函数与EXIT函数与函数的RETURN语句 (46)
9.5多个源代码文件程序的编译 (47)
9.5.1头文件的使用 (47)
9.5.2#include与#define的意义 (47)
9.5.3#ifndef与#endif (47)
9.6函数的递归 (48)
9.6.1递归的过程分析 (48)
9.6.2递归的优点 (52)
9.6.3递归的缺点 (52)
1指针 (52)
1.1指针 (52)
1.1.1指针的概念 (52)
1.1.2指针变量的定义 (52)
1.1.3&取地址运算符 (52)
1.1.4无类型指针 (52)
1.1.5NULL (53)
1.1.6空指针与野指针 (53)
1.1.7指针的兼容性 (53)
1.1.8指向常量的指针与指针常量 (54)
1.1.9指针与数组的关系 (54)
1.1.10指针运算 (54)
1.1.11通过指针使用数组元素 (55)
1.1.12指针数组 (55)
1.1.13指向指针的指针(二级指针) (55)
1.1.14指向二维数组的指针 (57)
1.1.15指针变量做为函数的参数 (57)
1.1.16一维数组名作为函数参数 (57)
1.1.17二维数组名作为函数参数 (58)
1.1.18const关键字保护数组内容 (58)
1.1.19指针做为函数的返回值 (58)
1.1.20指向函数的指针 (59)
1.1.21把指向函数的指针做为函数的参数 (60)
1.1.22memset,memcpy,memmove函数 (61)
1.1.23指针小结 (63)
2字符指针与字符串 (64)
2.1指针和字符串 (64)
2.2通过指针访问字符串数组 (64)
2.3函数的参数为CHAR * (64)
2.4指针数组做为MAIN函数的形参 (65)
3内存管理 (65)
3.1作用域 (65)
3.1.1auto自动变量 (65)
3.1.2register寄存器变量 (65)
3.1.3代码块作用域的静态变量 (66)
3.1.4代码块作用域外的静态变量 (66)
3.1.5全局变量 (66)
3.1.6外部变量与extern关键字 (66)
3.2内存四区 (66)
3.2.1代码区 (67)
3.2.2静态区 (67)
3.2.3栈区 (67)
3.2.4栈溢出 (68)
3.2.5堆区 (68)
3.3堆的分配和释放 (70)
3.3.1malloc (70)
3.3.2free (70)
3.3.3calloc: (70)
3.3.4realloc (71)
4结构体,联合体,枚举与TYPEDEF (71)
4.1结构体 (71)
4.1.1定义结构体struct和初始化 (71)
4.1.2访问结构体成员 (71)
4.1.3结构体的内存对齐模式 (72)
4.1.4指定结构体元素的位字段 (72)
4.1.5结构数组 (72)
4.1.6嵌套结构 (73)
4.1.7结构体的赋值 (73)
4.1.8指向结构体的指针 (73)
4.1.10结构中的数组成员和指针成员 (73)
4.1.11在堆中创建的结构体 (74)
4.1.12将结构作为函数参数 (74)
4.1.13结构,还是指向结构的指针 (74)
4.2联合体 (75)
4.3枚举类型 (75)
4.3.1枚举定义 (75)
4.3.2默认值 (76)
4.4TYPEDEF (76)
4.5通过TYPEDEF定义函数指针 (76)
5文件操作 (77)
5.1FOPEN (77)
5.2二进制和文本模式的区别 (77)
5.3FCLOSE (78)
5.4GETC和PUTC函数 (78)
5.5EOF与FEOF函数文件结尾 (78)
5.6FPRINTF,FSCANF,FGETS,FPUTS函数 (78)
5.7STAT函数 (78)
5.8FREAD和FWRITE函数 (79)
5.9FREAD与FEOF (79)
5.10通过FWRITE将结构保存到二进制文件中 (79)
5.11FSEEK函数 (80)
5.12FTELL函数 (80)
5.13FFLUSH函数 (80)
5.14REMOVE函数 (81)
5.15RENAME函数 (81)
6基础数据结构与算法 (82)
6.1什么是数据结构 (82)
6.2什么是算法 (82)
6.3排序 (83)
6.3.1冒泡排序 (83)
6.3.2选择排序 (83)
6.4查找 (83)
6.4.1顺序查找 (83)
6.4.2二分查找 (83)
6.5链表 (84)
6.5.1单向链表定义 (84)
6.5.2单向链表数据结构定义 (85)
6.5.3单向链表的实现 (85)
1愉快的开始-hello world
1.1include头文件包含
include是要告诉编译器,包含一个头文件,
在C语言当中,任何库函数调用都需要提前包含头文件
<头文件>,代表让C语言编译器去系统目录下寻找相关的头文件
“头文件”,代表让C语言编译器去用户当前目录下寻找相关头文件
如果是使用了一个C语言库函数需要的头文件,那么一定是#include <>
如果使用了一个自定义的h文件,那么一定是#include “”
1.2main函数
main函数是C语言中的主函数,一个C语言的程序必须有一个主函数,也只能有一个主函数
1.3注释
//,单行注释,代表注释,就是一个文字说明,没有实质的意义,单行注释是C++语言的注释方法
/* */,多行注释,多行注释是标准C语言的注释方法
1.4{}括号,程序题和代码块
C语言所有的函数的代码都是在{}里包着的
1.5声明
Int a;
声明一个变量名字叫a,对于c语言,变量的名称是可以子定义的。

保密第14页
1.6C语言自定义名字的要求
可以使用大小写字母,下划线,数字,但第一个字母必须是字母或者下划线
字母区分大小写
不能用C语言的关键字做为变量名称
每一行,必须是;结尾
1.7printf函数
printf是向标准输出设备输出字符串的
如果要输出一个字符串:。

例如:printf(“hello world”);
如果要输出一个整数,例如:printf(”%d”, 整数)
Printf(“\n”);会输出一个回车换行
1.8return语句
一个函数遇到return语句就终止了,return是c语言的关键字
1.9System系统调用
System库函数的功能是执行操作系统的命令或者运行指定的程序,system库函数的调用需要include<stdlib.h>
1.9.1System返回值在windows和unix下的不同,
1.9.2POSIX
保密第15页
1.10C语言编译过程,gcc参数简介
1.10.1C语言编译过程
1.10.2-E预编译
Gcc –E –o a.e a.c
预编译a.c文件,生成的目标文件名为a.e
预编译是将include包含的头文件内容替换到C文件中中,同时将代码中没用的注释部分删除
1.10.3-S汇编
-s就是将c语言转化为汇编语言,
1.10.4-c编译
将代码编译为二进制的机器指令
1.10.5链接
Gcc没有任何参数,代表就是链接
保密第16页
1.11操作系统结构
1.11.1用户模式
应用程序都是运行在用户区域
1.11.2内核模式
操作系统的内核,设备驱动程序,这些都是在内核模式下运行的
保密第17页
1.1264位,32位系统区别
1.1
2.1CPU内部结构与寄存器
1.1
2.2RISC与CISC CPU构架
RISC精简指令集
CISC复杂指令,一般来讲x86构架的CPU都是复杂指令的,AMD,intel就x86构架的,linux就是基于x86的操作系统
1.1
2.3SPARC,x86与ARM
Sun有自己的CPU,是基于SPARTC,其实就是一款RISC的CPU
1.13汇编语言
1.13.1I386汇编简介
Mov eax, 10
Add eax, 10
保密第18页
Sub eax, 20
Call printf
1.13.2VS反汇编
先f9设置一个断点
F5,用调试方式运行代码
1.14IDE工具
1.14.1QT常用快捷键
1.14.2VS常用快捷键
1.14.3VS断点,调试
2C语言中的数据类型
2.1常量
常量就是在程序中不可变化的量,常量在定义的时候必须给一个初值。

2.1.1#define
定义一个宏常量
2.1.2const
定义一个const常量
保密第19页
2.2字符串常量
“hello world”
对于#define类型的常量,c语言的习惯是常量名称为大写,但对于普通const常量以及变量,一般为小写结合大写的方式
2.3二进制数、位、字节与字
我们习惯于十进制的数:10,12等
一个位只能表示0,或者1两种状态,简称bit,一个位是一个bit
一个字节为8个二进制,称为8位,简称BYTE,8个比特是一个字节
一个字为2个字节,简称WORD。

两个字为双字,简称DWORD
2.4八进制
八进制为以8为基数的数制系统,C语言当中0表示八进制,0666;
2.5十六进制
十六进制值16为基数的数制系统,C语言中用0x表示十六进制
十进制转化8进制,用十进制数作为被除数,8作为除数,取商数和余数,直到商数为0的时候,将余数倒过来就是转化后的结果
保密第20页
十进制转化16进制,用十进制数作为被除数,16作为除数,取商数和余数,直到商数为0的时候,将余数倒过来就是转化后的结果
2.6原码
将最高位做为符号位(0代表正,1代表负),其余各位代表数值本身的绝对值
2.7反码
一个数如果值为正,那么反码和原码相同
一个数如果为负,那么符号位为1,其他各位与原码相反
2.8补码
原码和反码都不利于计算机的运算,如:原码表示的7和-7相加,还需要判断符号位。

正数:原码,反码补码都相同
保密第21页
负数:最高位为1,其余各位原码取反,最后对整个数+ 1
2.9sizeof关键字
sizeof是c语言关键字,功能是求指定数据类型在内存中的大小,单位:字节
sizeof与size_t类型
2.10int类型
2.10.1int常量,变量
int就是32位的一个二进制整数,在内存当中占据4个字节的空间
保密第22页
2.10.2printf输出int值
%d,输出一个有符号的10进制整数,%u,代表输出一个无符号的十进制整数
2.10.3printf输出八进制和十六进制
%x,代表输出16进制数,%X,用大写字母方式输出16进制数
%o代表输出八进制数
2.10.4short,long,long long,unsigned int
short意思为短整数,在32位系统下是2个字节,16个比特
long意思为长整数,在32位的系统下,long都是4个字节的,在64位系统下,windows 还是4个字节,unix下成了8个字节。

Int不管是32位系统下,还是64位系统下,不论是windows还是unix都是4个字节的
Long long是64位,也就是8个字节大小的整数,对于32位操作系统,CPU寄存器是32位,所以计算longlong类型的数据,效率很低
9l,9L,9ll,9LL,9u,9ull,9ULL
2.10.5整数溢出
计算一个整数的时候超过整数能够容纳的最大单位后,整数会溢出,溢出的结果是高位舍弃。

当一个小的整数赋值给大的整数,符号位不会丢失,会继承
2.10.6大端对齐与小端对齐
对于arm,intel这种x86构架的复杂指令CPU,整数在内存中是倒着存放的,低地址放低位,高地址放高位,小端对齐。

但对于unix服务器的CPU,更多是采用大端对齐的方式存放整数
保密第23页
2.11char类型
2.11.1char常量,变量
char c;定义一个char变量
‘a’,char的常量
Char的本质就是一个整数,一个只有1个字节大小的整数
2.11.2printf输出char
%c意思是输出一个字符,而不是一个整数
2.11.3不可打印char转义符
\a,警报
\b退格
\n换行
\r回车
保密第24页
\t制表符
\\斜杠
\’单引号
\”双引号
\?问号
2.11.4char和unsigned char
char取值范围为-128到127
unsigned char为0-255
2.12浮点float,double,long double类型
2.12.1浮点常量,变量
Float在32位系统下是4个字节,double在32位系统下是8个字节
小数的效率很低,避免使用,除非明确的要计算一个小数。

2.12.2printf输出浮点数
%f,%Lf
%f是输出一个double
%lf输出一个long double
2.13类型限定
2.1
3.1const
const是代表一个不能改变值的常量
保密第25页
2.1
3.2volatile
代表变量是一个可能被CPU指令之外的地方改变的,编译器就不会针对这个变量去优化目标代码。

2.1
3.3register
变量在CPU寄存器里面,而不是在内存里面。

但regist是建议型的指令,而不是命令型的指令
3字符串格式化输出和输入
3.1字符串在计算机内部的存储方式
字符串是内存中一段连续的char空间,以’\0’结尾
保密第26页
“”是C语言表达字符串的方式
3.2printf函数,putchar函数
printf格式字符
字符对应数据类型含义
d int 接受整数值并将它表示为有符号的十进制整数
hd Short int 短整数
hu Unsigned short int 无符号短整数
o unsigned int 无符号8进制整数
u unsigned int 无符号10进制整数
x / X unsigned int 无符号16进制整数,x对应的是abcdef,X
对应的是ABCDEF
f float或double 单精度浮点数或双精度浮点数
e / E double 科学计数法表示的数,此处"e"的大小写代表在
输出时用的“e”的大小写
保密第27页
c char 字符型。

可以把输入的数字按照ASCII码相应
转换为对应的字符
s / S char * / wchar_t * 字符串。

输出字符串中的字符直至字符串中的
空字符(字符串以'\0‘结尾,这个'\0'即空字符)p void * 以16进制形式输出指针
% % 输出一个百分号
printf附加格式
字符含义
l 附加在d,u,x,o前面,表示长整数
- 左对齐
m(代表一个整数) 数据最小宽度
0 将输出的前面补上0直到占满指定列宽为止
不可以搭配使用-
N(代表一个整数) 宽度至少为n位不够以空格填充
Putchar是显式一个字符的函数
3.3scanf函数与getchar函数
scanf通过键盘读取用户输入,放入变量中,记得参数一定是变量的地址(&)
int a = 0;
int b = 0;
scanf("%d", &a);//一定要用&取变量的地址
scanf("%d", &b);//一定要用&取变量的地址
Getchar得到用户键盘输入的字符
保密第28页
4运算符表达式和语句
4.1基本运算符
4.1.1=
数据对象:泛指数据在内存的存储区域
左值:表示可以被更改的数据对象
右值:能赋给左值的量
4.1.2+

4.1.3–

4.1.4*

4.1.5/

4.1.6%
取余数
4.1.7+=
加等于
4.1.8-=
减等于
4.1.9*=
乘等于
保密第29页
4.1.10/=
除等于
4.1.11%=
取余等于
4.1.12++
自加1
,i++先计算表达式的值,然后再++
,++i是先++,再计算表达式的值
4.1.13--
自减一
4.1.14逗号运算符
逗号表达式先求逗号左边的值,然后求右边的值,整个语句的值是逗号右边的值。

4.1.15运算符优先级
保密第30页
4.2复合语句
{}代码块
4.3空语句
只有一个;号的语句就是空语句,空语句在C语言里面和合法的,并且是在某些场合必用的4.4类型转化
5条件分支语句
5.1关系运算符
在C语言中0代表false,非0代表真
5.1.1<
小于
5.1.2<=
小于等于
保密第31页
5.1.3>
大于
5.1.4>=
大于等于
5.1.5==
等于
5.1.6!=
不等于
5.2关系运算符优先级
前四种相同,后两种相同,前四种高于后两种优先级
5.3逻辑运算符
5.3.1&&

当运算符左右都是真的时候,那么整个表达式的结果为真
只有左右有一个值为假,那么整个表达式的结果为假
5.3.2||

保密第32页
当运算符左右只要有一个值是真的时候,那么整个表达式的结果为真
除非左右两个值都是假,那么整个表达式的结果为假
5.3.3!

当值为真的时候,表达式为假,
当值为假的时候,表达式为真
5.4if
单分支
If (条件)
{
//复合语句
}
当条件是真的时候,复合语句才能被执行,如果条件为假的时候,复合语句不执行
保密第33页
5.5if else
双分支
If (条件)
{
复合语句1
}
Else
{
复合语句2
}
如果条件为真,那么执行复合语句1,否则执行复合语句2
5.6if else if
多重if
If (条件1)
{
复合语句1
}
Else if (条件2)
{
复合语句2
}
Else if (条件3)
保密第34页
{
复合语句3
}
Else
{
复合语句4
}
当有多个else的时候,else总是和上方最近的那个if语句配对。

5.7switch与break,default
多重选择
保密第35页
什么时候用if,什么时候用switch
当条件很复杂,一个条件中有&&,|| ,!存在,那么用if语句
如果条件很简单,但分支很多,那么适合用switch
5.8条件运算符?
一个求绝对值的例子
先求?左边的条件,如果条件为真,那么等于:左边的值,否则等于:右边的值
一个求最大值的例子
5.9goto语句与标号
无条件跳转goto
不建议使用goto语句,goto语句会使你的程序可读性变的很差
6循环语句
6.1while
while(条件),如果条件为真,循环继续,条件为假,循环结束
保密第36页
while (1)、、是死循环的写法
6.2continue
循环遇到continue语句,不再执行continue下面代码,而是直接返回到循环起始语句处继续执行循环
6.3break
循环遇到break语句,立刻终端循环,循环结束
6.4do while
do
复合语句
while (条件);
对于do while来讲,循环的复合语句至少可以被执行一次
对于while来讲,有可能复合语句一次执行机会都没有
6.5for
for(int I = 0;i<10;i++)
6.6循环嵌套
保密第37页
7数组
7.1一维数组定义与使用
7.2数组在内存的存储方式
数组在内存中就是一段连续的空间,每个元素的类型是一样的
7.3一维数组初始化
保密第38页
7.4二维数组定义与使用
7.5二维数组初始化
8字符串与字符数组
8.1字符数组定义
8.2字符数组初始化
保密第39页
8.3字符数组使用
8.4随机数产生函数rand与srand
头文件stdlib.h
Rand是伪随机数产生器,每次调用rand产生的随机数是一样的
如果调用rand之前先调用srand就出现任意的随机数
只要能保证每次调用srand函数的时候,参数的值是不同的,那么rand函数就一定会产生不同的随机数
8.5用scanf输入字符串
保密第40页
8.6字符串的结束标志
Scanf将回车,空格都认为是字符串输入结束标志,
8.7字符串处理函数
8.7.1gets
Gets不能用类似“%s”或者“%d”之类的字符转义,只能接受字符串的输入
8.7.2fgets函数
gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。

多出来的字符会导致内存溢出,fgets函数改进了这个问题。

保密第41页
由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便
8.7.3puts函数
puts会在最后自动添加一个’\n’
puts函数打印字符串,与printf不同,
是puts的文件操作版本,
fputs
size_t strlen(const char * _Str);
返回不包含字符串结尾’\0’的字符串长度
8.7.6strcat,字符串追加
size_t strcat(char * _Str1, const char * _Str2);
将参数_Str2追加到_Str1后尾
保密第42页
8.7.7strncat,字符串有限追加
size_t strncat(char * _Str1, const char * _Str2, size_t len);
8.7.8strcmp,字符串比较
int strcmp(const char * _Str1, const char * _Str2);
比较两个字符串是否相等,相等返回0,不等返回非0
8.7.9strncmp,字符串有限比较
8.7.10strcpy字符串拷贝
char *strcpy(char * _Str1, const char * _Str2);
将参数_Str2拷贝到参数_Str1中
8.7.11strncpy字符串有限拷贝
8.7.12sprintf,格式化字符串
和printf函数功能类似,printf函数将格式化结果输出到屏幕,sprintf将格式化结果输出到保密第43页
字符串
8.7.13Sscanf函数
Sscanf类似于scanf函数,,scanf从键盘读取用户输入,scanf从指定格式化字符串读取输入
8.7.14strchr查找字符
char * strchr(char * _Str, int_Ch);
在参数_str中查找参数_Ch指定字符,找到返回字符_Ch在_Str中所在位置,没有找到返回NULL;
8.7.15strstr查找子串
char * strstr(char * _Str, const char * _SubStr)
在参数_str中查找参数_SubStr指定子串,找到返回子串在_Str中所在位置,没有找到返回NULL;
8.7.16strtok分割字符串
字符在第一次调用时strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL 每次调用成功则返回指向被分割出片段的指针
保密第44页
8.7.17atoi转化为int
需要包含头文件stdlib.h
8.7.18atof转化为float
8.7.19atol转化为long
9函数
9.1函数的原型和调用
在使用函数前必须定义或者声明函数
9.2函数的形参与实参
在调用函数的时候,函数大多数都有参数,主调函数和被调用函数之间需要传递数据。

在定义函数时函数名后面括弧中的变量名称为“形式参数”,简称形参。

在调用函数时,函数名后面括号中的变量或表达式称为“实际参数”,简称实参。

保密第45页
1形参在未出现函数调用时,他们并不占用内存单元,只有在发生函数调用的时候形参才被分配内存,函数调用完成后,形参所占的内存被释放
2实参可以是变量,常量或者表达式
3在定义函数时,一定要指定形参的数据类型
4形参与实参的数据类型一定要可兼容
5在C语言中,实参与形参的数据传递是“值传递”,即单向传递,只由实参传递给形参,而不能由形参传递给实参。

如果函数的参数是个数组,那么是可以通过形参修改实参的值的
9.3函数的返回类型与返回值
1函数的返回值通过函数中的return获得,如果函数的返回值为void可以不需要return 语句。

2函数return语句中的返回值数据类型应该与函数定义时相同。

3如果函数中没有return语句,那么函数将返回一个不确定的值。

9.4main函数与exit函数与函数的return语句
保密第46页
9.5多个源代码文件程序的编译
9.5.1头文件的使用
如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,那么就需要在第一个文件中声明函数原型。

如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都声明其原型了。

把函数声明放入头文件是很好的习惯。

9.5.2#include与#define的意义
#include就是简单的文件内容替换
#define就是简单的文本替换而已
9.5.3#ifndef与#endif
#ifndef的意思就是条件预编译,如果#ifndef 后面的条件成立,那么就预编译从#ifndef开始到#endif之间的代码,否则不会去预编译这段代码
保密第47页
9.6函数的递归
函数可以调用自己,这就叫函数的递归
9.6.1递归的过程分析
保密第48页
保密第49页
有n个人排成一队,问第n个人多少岁,他回答比前面一个人大2岁,再问前面一个人多少岁,他回答比前面一个人大2岁,一直问到最后问第一个人,他回答10岁
int age(int n)
{
int i;
if (n == 1)
i = 10;
else
i = age(n - 1) + 2;
return i;
}
将10进制数转化为二进制数的例子
234在十进制下为2 * 10的2次方+ 3 * 10的1次方+ 4*10的0次方。

奇数的二进制最后一位一定是1,偶数的二进制最后一位一定是0。

可以通过number % 2 得到二进制形式的最后一位,如果要将一个完整的整数转化为二进制就需要用到递归函数。

保密第50页。

相关文档
最新文档