C 语言进阶

Mark Walen大约 2 分钟

C 语言进阶

void 使用

  1. void 无类型,不可以通过 void 创建类型;
  2. 限定函数返回值,限定函数参数;
  3. void * 泛型指针。

sizeof 的使用

  1. sizeof 本质不是一个函数,是一个运算符;
  2. sizeof 的返回值是 unsigned int
  3. 统计数组占用内存空间大小。

变量的修改

  1. 直接修改;
  2. 间接修改(指针修改);

内存分区

运行前

  1. 预处理:宏定义展开、头文件展开、条件编译,不会检查语法;
  2. 编译:检查语法,将预处理后文件编译生成汇编文件;
  3. 汇编:将汇编文件生成目标文件(二进制文件);
  4. 链接:将目标文件链接为可执行程序。
  • 代码区(只读)
  • 数据区(全局变量、静态变量)
    • data (数据已初始化)
    • bss (数据未初始化)
    • 常量

运行后

  1. 代码区
  2. 数据区
  3. 栈区
  4. 堆区

全局变量和静态变量

静态变量

  1. 程序运行前分配内存;
  2. 生命周期在程序运行结束时死亡;
  3. 默认属于内部链接属性,在当前文件中使用

全局变量

  1. 在 C 语言中,默认情况下,全局变量前加了关键字 extern;
  2. 属于外部属性;

const 修饰的变量

  1. 全局 const 修饰常量
    1. 直接修改:失败;
    2. 间接修改:语法通过,受常量区保护;
  2. 局部 const 修饰常量
    1. 直接修改:失败;
    2. 间接修改:成功,因为放在栈上。

字符串常量

  1. 在 vs 下将相同的字符串常量看作是同一个;
  2. 对于字符串常量的修改结果是未定义的,vs 是不可以修改的。

一级指针易错点

  1. 指针越界;
  2. 指针叠加会不断改变指针的指向,释放指针内存会出错,解决方案,利用临时指针;
  3. 返回局部变量地址;
  4. 同一块内存多次释放,不可以释放野指针,可以多次释放空指针。

一维数组

  1. 一维数组的名称是不是指向第一个元素的指针? 除以下两种情况:
    1. 对数组名称 sizeof;
    2. 对数组名称取地址,步长是整个数组长度。
  2. 数组名是指针常量,指针的指向是不可以修改的,指针指向的值可以修改

二维数组

  1. 一般情况下,指向第一行数组指针;