1. 基本要素
1. 命名: (1)只能以字母或下划线开头
(2) 只能包含数字,字母以及下划线
2. 命名空间: 所有的标识符处在4个命名空间的其中一个。
3. 缩进: 最好用8个空格缩进,避免不同的编译器对<TAB>键的缩进程度
2. 基本数据类型
1. 布尔常量是指:true和false,占用4个字节
布尔变量是指:自定义变量,占用1个字节
2. 事实上,true 和 false 是以下宏定义:这就是为什么占用4个字节的原因了。
#define true 1
#define fase 0
3. 实际上bool变量占用1个字节,而true和false占用4个字节,它们实际上都是int型
4. 由基本数据类型通过typedef预定义好的固定长度的数据类型称为系统基本数据类型。
5. C语言世界里,非0即真。
3. 运算符
1. 两个整型相除的结果是整型,小数部分将被舍弃(而不是四舍五入)
2. 取模运算符左右两边的操作数都必须是整型int
3. ++a 时:先进行自增/自减再参与运算
a++ 时: 先参与运算再进行自增/自减
4. 在逻辑与操作(&&)中:只要有一个表达式的值我为假(即为0)则整个表达式的值就为假
在逻辑或操作(||)中:只要有一个表达式为真(即不为0)则整个逻辑表达式的值就为真。
5. 在逻辑运算语句中特别注意:当左边的表达式能够决定整个表达式的值时,右边的表达式
会被直接忽略掉,在其中的所有运算都不会被执行。(注意:在&&中,如果第一个为假,则整个都是假)
6. 位逻辑反运算符(~)是对数据进行取反操作,即:0 变 1, 1 变 0
7. 位逻辑与运算、位逻辑或运算:与逻辑与、逻辑或运算相同(需结合非 0 即 真 去细想)
8. 位逻辑异或运算符(^):相同为0, 不同为1
9. 移位运算(<<,>>):操作数必须是整型,并且不管是有符号还是无符号整型都遵循着同一个原则:
凡是被移除去的位全部丢弃,凡是空出来的位全部补上。
10. 所有的关系表达式都是布尔值
11. 理解C程序中变量的两个属性:地址和内容
(1) C程序中每一个变量都有一个地址,如果这个变量占用一个字节,那么该字节的地址就是该变量的地址。
(2) 如果该变量占用了n个字节,那么最低的那个地址就作为该变量的地址,而该变量的空间内存放的值即为该变量的内容
12. 赋值语句注意点:
(1) 不能对常量赋值
(2) 不能对只读变量赋值
(3) 不能对数组整体赋值
13. sizeof 运算符用来计算某种类型所占的字节数。它的操作数可以是类型,也可以是变量。
(1) 如果是类型:则一定要添加圆括号
(2) 如果是变量:则圆括号可以省略
14. 注意:sizeof 如果对数组求大小,则计算结果是数组元素类型大小乘以元素个数
15. sizeof 也可以用来直接返回字符串所占空间的大小,比如sizeof("abc")返回的结果是4,包括后面的字符串结束标记'\0'
16. 逗号','表达式的运算顺序是从左到右,逗号运算符具有最低运算优先级,整个逗号表达式的值取决于最右边的表达式的值。
17. return 有两个作用
(1) 当出现在主函数main()中:退出进程,将其值返回给父进程
(2) 当出现在普通函数中: 作用是返回其调用者
4. 控制流
1. switch(expression)语句中,expression可以是:
(1) 变量
(2) 运算表达式甚至是函数调用
(3) 但其结果必须保证是整型
5. 函数
1. 函数头包含3个重要信息:
(1) 函数的名字
(2) 函数的返回值类型
(3) 函数的参数列表
2. 函数使用中的3个主要部分:
(1) 函数的声明:即函数头
(2) 函数的调用:可传实参
(3) 函数的定义:函数功能实现的代码所在
3. 实参是调用者定义的变量,形参是被调用函数定义的变量,它们是相对独立的,拥有各自的内存
形参是由实参来初始化的。
4. 栈内存
(1) 每一个函数在运行时,都会占据一段栈内存,大小视其函数定义的局部变量的具体情况而定。
(2) 一个程序里面的所有函数所占据的栈内存在逻辑上是连在一起的。
函数之间的相互调用会不停的分配栈内存,其上的栈内存就是其调用者的栈内存。
(3) 栈帧是向下(低地址)堆叠的,所以上面是栈底,下面是栈顶。
(4) 一个C程序的栈帧由若干段函数的栈帧组成的,每一段栈帧都被用来存放对应函数的局部变量(也有其它值)
(5) 栈内存的另一个最重要的特性:临时性,一旦对应的函数退出,相应的栈帧将立即被释放(即被系统收回)。
5. 递归函数一定要有个结束递归的情况,否则将会进入无穷递归
6. 递归函数的特点:
(1) 短小精悍
(2) 弱点:效率低且容易使得栈溢出。
7. 变参函数给形参赋值时从右至左分配内存的。
8. 内联函数的特性:用空间代价(程序尺寸增大)来换取时间效率(不再需要切换函数),这样的函数称为内联函数(inline)
9. 内联函数一般是被放在头文件里面的。
6. 数组和指针
1. 任意数据类型的数组都是合法的,包括指针数组,结构体数组,甚至数组的数组
2. 初始化数组列表的元素个数比数组长度短是允许的。
3. 如果数组是静态数组,则会自动初始化 0 ,否则随机值
4. 内存地址是一片内存中每个字节(byte)的编号
5. 一个数据最基本的属性:内容和地址,内容指的就是内存中所存放的二进制串。
地址指的就是这块内存的编号,一个数据的地址也称为这个数据的指针。
6. 每一个字节都有其对应的地址,编译器会将最小的地址作为类型数据的地址,就是所谓的基地址。提到一个变量的地址时
指的都是基地址。
7. 在 32 位系统中,任何地址都是4个字节的。
8. 0x0000 8000 --> 0x0804 8000 :任何程序都无法访问的内存