注意 strlen 和 sizeof 的区别
strlen计算的是第一个 ‘\0’ 前面的字符的个数
sizeof计算的是占用的内存空间的大小只和定义时有关
C语言中,输出double类型(双精度)和float(单精度)时, 编译器默认精确到小数点后六位输出 默认输出的是6位小数,不足6位,以0补齐,超过6位按四舍五入截断。
字符串数组在内存中存储,不管大端还是小端, 都是首个字符先存储,ASII值转换成二进制存储相应的比特位即可
C语言的本质是操作内存
内存分配的方式:
1.定义变量时,由操作系统根据变量的类型在栈区分配
存储类型 数据类型 变量名;
2.程序员使用malloc手动在堆区分配
C语言变量的数据类型:
基本类型:
字符类型 char % c 1 B
短整型 short % d 2 B
整型 int % d 4 B
长整型 long % ld 32 位:4 B 64 位:8 B
长长整型 long long % lld 8 B
单精度浮点型 float % f 4 B
双精度浮点型 double % lf 8 B
多精度浮点型 long double % llf 32 位:12 B 64 位:16 B
枚举类型 enum
构造类型:
数组
结构体 struct
共用体(联合体) union
指针类型:
作用:
决定从他保存地址开始,能操作几个字节-- -- -- -- -- -- -- -> 操作空间的大小
空类型:
void
void *
存储类型:
const 用来修饰变量时,表示只读变量 const int a =10;
a的值不能修改
const 修饰指针时:
看const 和 * 的位置关系
const int * p;
int const * p;
不能通过指针p修改指向空间的内容
但是指针的指向是可以修改的
int * const p;
指针的指向不能修改
但是允许通过指针修改指向空间的内容
const int * const p;
1. 延长局部变量的生命周期-- -- -- -- -- -- -> 从最近的{
} 结束至整个程序结束
2. 限制作用域:static 修饰的变量或者函数只能在当前文件中访问;
声明一个函数或者变量在其他的. c文件中定义;
如果一个. c文件中需要使用另外一个. c文件中的变量或者函数;
需要在第一个. c文件中使用extern 声明;
register 修饰的是一个寄存器类型的变量,被执行的效率高;
CPU取数据的优先级(寄存器 > 高速缓存(cache)> 内存)
但是CPU的寄存器的个数是有限的
所以,把所有的变量都定义成寄存器变量是不现实的-- -- -- -- -> 实际开发时,一般不用
注意:register 修饰的变量是不能取地址的;
防止编译器优化
要求CPU每次取数据都必须在内存上取
使用场景:
1. 中断状态的寄存器
2. 多线程访问同一个变量
声明一个变量时自动类型
定义局部变量时不写存储类型,默认的都是自动类型
非自动类型的变量:
全局变量
static 修饰的局部变量
分文件编程:
. c源文件: 存放函数的定义;
. h头文件: 存放函数的声明和类型的定义;
mai