C语言程序设计-谭浩强第五版
P0、基础知识
必备单词
- include :标准输入输出流
- define:宏定义,预处理
- return 、continue
- typedef: 给数据类型区别名
- struct:结构体
- union :共用体
- sizeof:求变量或类型的字节数
- sqrt(x):开x的平方
- pow(x,n)。它返回值就是x的n次方
- abs(x):求绝对值
符号优先级
格式化字符
%d //整型输出
%ld //长整型输出
%o //以八进制数形式输出整数
%x //以十六进制数形式输出整数,或输出字符串的地址
%u //以十进制数输出unsigned型数据(无符号数)
注意:%d与%u的区别是,有无符号(正负号)和数值范围(%u范围大)不同,也就是极限的值不同,不然数值打印出来会出错。
%c //用来输出一个字符
%s //用来输出一个字符串
%f //用来输出实数,以小数形式输出,默认情况下保留小数点6位
%.5f //用来输出实数,保留小数点5位
%e //以指数形式输出实数eg:a=3e+10<=>3*10^10;
注意:e的前面和后面的值必须是整数
%g //根据大小自动选f格式或e格式,且不输出无意义的零
题型分析
进制脚标
进制转换
- 非十转十(步骤:1.确定权 2.标指数)
- 十转非十(短除法,从下取余)
ASCII码
大小写字母的ASCII码相差:32位(也就是空格)
ASCII码对照表
转义字符
- \ :单个斜杠表示上下两行是连续的,类似英语中的 -
P1.程序设计基本概念
1.1、程序
P4 、变量
变量的取名
-
英文字母、数字、下划线
-
不能够是数字开头
-
不能够使用关键字(共44个)
数据类型
P5、常量和宏定义
常量
定义符号常量
命名规范和变量类似。
P6、数据类型
sizeof运算符,用于获取数据类型或表达式的长度
signed 和 unsigned
声明变量是否带符号位
声明一个不带符号位int变量num
unsigned int num
P7、取值范围
放心吧,为了让你听懂这节课,我已经在我女性同学身上做了实验。在昨天买菜的路上,就试探的问了一下,嘿man,哦不,嘿baby,你知道这个二进制是怎么回事吗?她说不知道。我说那你想知道吗?她说不想知道,哎呀!一下我就火了,哎呀pia pia两下,我就给了她两个大耳光。然后我就给她普及了什么是二进制,什么是cpu的基本原理,又讲了C语言的基本数据类型,还有今天我们讲的这个取值范围。完了回家之后,我就整了几道题给她做做,做不完你别吃饭,唉!她就居然都做对了。所以我在想,你应该是可以听得懂的。
P8、字符和字符串
p9、算术运算符
自加自减运算符(重点)
前值用法
后值用法
int i=2;
i++ = a; //那么a的值等于2,i的值为3
逗号运算符
从左往右计算,结果取最后的值。
int a,b;
求 a=2,b=5,b++,a+b 的值
//原式 = 2,5,5,8
所以结果为:8
类型转换
- 使用整型去存放浮点型 则会错误
printf("%d\n",1 + 2.0); //会报错
- 解决自动转换错误:强制类型转换
printf("%d\n",1 + (int)2.0); //结果位3
P10、关系运算符、逻辑运算符
关系运算符
逻辑运算符
短路与运算
- a && b :a为false则不执行b
- a || b : a为true则不执行b
P11、顺序结构
赋值语句
数据输出
%f输出将会保留6位小数
float f = 24.56;
printf(%f,f) //输出结果为:24.560000
数据的输入
符合语句和空语句
P12、选择循环结构
if语句
-
if中的else遵循就近原则,选择最近未匹配的if进行配对
-
if语句只能控制后面的一条语句。
条件运算符(C程序中唯一的三目运算符)
switch语句
如果没有break,则会出现case穿透,且break只跳出一层switch
while语句
do-while语句
for语句
break与continue
P13、函数
- C程序基本结构是函数,最小功能单位是语句!
- 函数在调用前应该先定义,不是必须先定义
函数的定义
- 形参:定义函数时的参数,用于接收值,参数只能是变量
- 实参:函数使用时候的参数,用于传递值
返回值
- void: 声明无返回值类型函数,实际上是有返回,但无值
- return:用于返回数据,但只能返回一个值
函数的调用
- 参数调用和递归调用,是重点!
- 主函数不能调用自身
- 主函数具有有参函数和无参函数两种形式
- 若函数首部省略返回类型,则默认为int
函数的说明
删去函数体加分号即可;
14、数组
一维数组
长度声明必须是整型常量
一维数组的初始化
二维数组
二维数组的初始化
可以少赋值,但不能多赋值,错误示范如下
int a[2][3] = {1,2,3,4,5,6,7}; //三个一组,多出了一个7
15、指针
指针于变量
指针的赋值
空指针的定义
//定义一个空指针
int *p = 0 //方式1
int *p = null //方式2
&和*的用法
- “ & ” :用于取变量的地址
- “ * ”:用于取指针内容
- “ ** ”:二级指针,也称指针的指针,即指针的指针地址(多级指针也一样)
函数之间的地址传递
16、指针与一维数组
a 等价于a[0]的地址:a <==> &a[0]
-
注意避坑!
//下面两个式子并不一样,有括号先算括号 *(p+1)= *q+1=
地址可以相减,但不能相加
函数之间对一维数组的引用
17、指针与二维数组
一维数组和二维数组对吧
18、数组指针、指针数组(必考)
如何判断
- 括号把指针说明符与变量先结合,则为数组指针
- 变量和[ ]先结合,则为指针数组
总结:变量先和谁结合,就是谁
指针函数、函数指针
判断和数组一样!
19、字符串
字符串不能使用关系运算符进行比较,比如 ==,>
字符数组
- 和整型数组一样,可以少赋值,不能多赋值,未赋值的默认为“/0”
字符数组和字符串
- 字符数组存放字符串的条件:字符数组长度 >= 字符串长度+1
字符串指针
输入输出函数
字符串输入输出函数
小结
20、字符串函数(必考)
- \t:制表符
- \x:后接十六进制
- \0: 后接八进制
- \n: 回车
sizeof()函数:计算长度,函数参数可以是变量,也可以是常量
strcpy(a,b):字符串复制,讲字符串b复制到字符串a
**strcat(a,b)😗*字符串连接,字符串a接上字符串b
**strcmp(a,b)😗*字符串比较,a大于b返回1,相等返回0,小于返回-1
21、变量的作用域和存储类
变量的作用域
变量的分类
- 按照作用域分类:局部变量,全局变量
- 按照生存分类:静态变量,动态变量
变量的存储类
关键字:auto,static
总结
- 静态变量的生存期为:整个程序
22、编译预处理
注意!替换的是文本,不是计算值
例题1
#define k 2+3 //那么k的内容为2+3,并不是5
k/k = 2+3/2+3 = 2+(3/2)+3 = 6 //注意运算优先级
例题2
#define f(x) x*x //见到f(x)就替换为 x*x
int a=6,b=2;
f(a) + f(b) = 40 //理解为a*a + b*b
f(a+b) = a+b * a+b = a+(b*a)+b = 20
例题3
23、标识符
- 预处理可以做用户标识符,但关键字不行
- 预定义可以使用大小写
24、预处理
主要的三种预处理功能:宏定义、文件包含、条件编译
文件包含
条件编译
自定义类型
typedef:给数据类型取别名
结构体
注意:结构体声明**{}后必须带分号**
结构体变量的定义
定义的几种形式
结构体初始化
初始化的几种形式
结构体成员的引用