C语言复习12
C语言学习,在这里推荐浙江大学翁恺老师的视频,慕课网网址:https://www.icourse163.org/learn/ZJU-9001?tid=9001#/learn/content
。笔者的复习笔记也主要是根据该视频进行。本文的主要内容如下
- 程序设计与C语言
- 计算
- 判断
- 循环
- 循环控制
- 数据类型
- 函数
- 数组
- 指针
- 字符串
- 结构类型
- 程序设计
全局变量;编译预处理和宏;大程序结构;上机12; - 文件
- 链表
refer
1.
12.1 全局变量
一、生存期和作用域
全局变量是定义在函数外边的变量(包括main函数),一般具有全局生存期和作用域,他们可以在任何函数内部使用。
二、全局变量初始化
本地变量未初始化会得到一个稀奇古怪的值,但是全局变量未初始化会得到0值,指针会得到NULL值。只能用编译时刻已知的值来初始化全局变量(即不能用scanf),它们的初始化在main函数之前。
三、静态本地变量
增加修饰符static来得到静态本地变量。当函数离开的时候,静态本地变量会继续存在并保持其值。静态本地变量的初始化只会在第一次进入函数的时候做,以后每次进入函数都会保持上次离开时候的值。
静态本地变量实际上是特殊的全局变量,具有全局生存期和函数内的局部作用域。
四、少用全局变量和静态本地变量
全局变量和静态本地变量使得线程不安全。
12.2 编译预处理和宏
一、编译预处理指令和宏
在第一张我们就讲过,从.c文件预处理后成.i文件,其中#开头的就是编译预处理指令,而#define用来定义一个宏。
#define不是C的语句,他的使用如下:define <名字> <值>
12.3 大程序结构
一、项目和编译单元
当我们程序过大的时候,就会出现多个.c文件,而一个.c文件实际上是一个编译单元,编译器每次编译只能处理一个编译单元。
在一个项目project中会有多个编译单元.c文件,编译器或者IDE需要把所有源代码文件编译后链接起来。
有的IDE有分开的编译和构建两个按钮,前者是编译,后者是将整个项目做链接。
二、头文件
函数原型会被放到一个头文件中(.h文件),需要在调用这个函数的源代码文件(.c文件)中#include这个头文件。
#include是一个编译预处理指令,和宏一样,在编译之前就需要处理。
#include有#include <>和#include ""两种形式。
其中#include ""
会要求编译器先在当前目录(.c文件所在目录)寻找这个文件,如果没有,则到编译器指定的目录中去找;
#include <>
会要求编译器只在指定的目录中去找;注意,环境变量和编译器命令行参数可以指定寻找头文件的目录。mac的环境变量加载顺序为:
a. /etc/profile # 系统级别
b. /etc/paths # 系统级别
c. ~/.bash_profile # 用户级别,常改找个
d. ~/.bash_login
e. ~/.profile
f. ~/.bashrc
#include不是用来引入库的,他只是为了让编译器知道printf函数的原型,保证调用时给出的参数值是正确的类型。
一般任何.c文件都有其对应同名的.h文件,把所有函数原型和全局变量声明都放进去。
不如欣赏一下红色警戒的源码:
https://github.com/electronicarts/CnC_Remastered_Collection/tree/master/REDALERT