基本语法
Token
- 组成、语法结构
- token
- 编译、运行C程序
- 数据类型
变量
变量是程序可操作的存储区的名称
定义变量
初始化:建议初始化所有变量
如果定义时没有初始化,带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。
变量声明
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
- 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
- 2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
- 除非有extern关键字,否则都是变量的定义。
- 有没有extern的区别https://www.runoob.com/cprogramming/c-variables.html
左值、右值
变量作用 域
局部变量、形式参数
函数内部、块内
局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。
全局变量
函数外部
全局变量保存在内存的全局存储区中,占用静态的存储单元;
常量
- #define 预处理指令
- const 关键字
字面量
整数、小数、字符、字符串
存储类
- auto
- extern
- register
- static
auto
auto 是所有局部变量默认的存储类
register
register 用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)
寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 'register' 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制 。
static
static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 的局部变量,也具有全局特性?
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。
extern
引用外部的变量、函数
函数
返回值、函数名、参数、函数体
函数声明
函数调用
参数传递
传值
传引用
可变参数
指针
- 空指针
- 指针运算
- 指针的指针
- 作为参数
- 作为返回值
- 函数指针
- void *
指针的大小
指向的类型、指向空间的大小
void *
void 类型表示未确定类型的指针。C、C++ 规定 void 类型可以通过类型转换强制转换为任何其它类型的指针。