C 语言进阶
大约 2 分钟
C 语言进阶
void 使用
void
无类型,不可以通过void
创建类型;- 限定函数返回值,限定函数参数;
void *
泛型指针。
sizeof 的使用
sizeof
本质不是一个函数,是一个运算符;sizeof
的返回值是unsigned int
;- 统计数组占用内存空间大小。
变量的修改
- 直接修改;
- 间接修改(指针修改);
内存分区
运行前
- 预处理:宏定义展开、头文件展开、条件编译,不会检查语法;
- 编译:检查语法,将预处理后文件编译生成汇编文件;
- 汇编:将汇编文件生成目标文件(二进制文件);
- 链接:将目标文件链接为可执行程序。
- 代码区(只读)
- 数据区(全局变量、静态变量)
- data (数据已初始化)
- bss (数据未初始化)
- 常量
运行后
- 代码区
- 数据区
- 栈区
- 堆区
全局变量和静态变量
静态变量
- 程序运行前分配内存;
- 生命周期在程序运行结束时死亡;
- 默认属于内部链接属性,在当前文件中使用
全局变量
- 在 C 语言中,默认情况下,全局变量前加了关键字 extern;
- 属于外部属性;
const 修饰的变量
- 全局 const 修饰常量
- 直接修改:失败;
- 间接修改:语法通过,受常量区保护;
- 局部 const 修饰常量
- 直接修改:失败;
- 间接修改:成功,因为放在栈上。
字符串常量
- 在 vs 下将相同的字符串常量看作是同一个;
- 对于字符串常量的修改结果是未定义的,vs 是不可以修改的。
一级指针易错点
- 指针越界;
- 指针叠加会不断改变指针的指向,释放指针内存会出错,解决方案,利用临时指针;
- 返回局部变量地址;
- 同一块内存多次释放,不可以释放野指针,可以多次释放空指针。
一维数组
- 一维数组的名称是不是指向第一个元素的指针? 除以下两种情况:
- 对数组名称
sizeof
; - 对数组名称取地址,步长是整个数组长度。
- 对数组名称
- 数组名是指针常量,指针的指向是不可以修改的,指针指向的值可以修改
二维数组
- 一般情况下,指向第一行数组指针;