一. C语言编译过程
-
预处理
- 宏定义展开
- 头文件展开
- 删除注释
- 条件编译
-
编译
- 检查语法
- 转化成汇编语言
-
汇编:将汇编语言转化成机器语言
-
链接:将库文件链接变成可执行文件
二. 数据类型
- 基本类型:它们是算术类型。包括整数类型和浮点类型。
- 枚举类型:也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量
- void类型:类型说明符void表示没有可用的值
- 函数返回为空:C中有一些函数不返回值,也可以说是返回空。例如:void exit(int status);
- 函数参数为空:C中有一些函数不接受任何参数,不带参数的函数可以接受一个void。例如:int rand(void)
- 指针指向void:类型为void *的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc(size_t size);返回指向void的指针,可以转换为任何数据类型
- 派生类型:指针类型 数组类型 结构类型 共用体类型和函数类型。数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。
三. 变量
3.1 变量的介绍
变量是程序可操作的存储区的名称。C中的每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
- char: 通常是一个字节(八位)。这是一个整数类型
- int
- double
- void:表示类型的缺失
- 枚举
- 指针
- 数组
- 结构
- 共用体
3.2 变量的定义
type varialble_list;
比如: int i, j, k
3.3 变量声明
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序链接时需要实际的变量声明。
变量声明的两种情况:
- 一种是需要建立存储空间。例如:int a 在声明的时候就已经建立了存储空间。
- 另一种是不需要建立存储空间,通过使用extern关键字声明变量名而不定义它。例如:extern int a 其中变量a可以在别的文件中定义的。
- 除非有extern关键字,否则都是变量的定义。
extern int i; //声明,不是定义
int i; //声明,也是定义
实例:
变量在头部已经被声明,但是定义与初始化在主函数内:
#include <stdio.h>
// 函数外定义变量x和y
int x;
int y;
int addtwonum(){
// 函数内声明变量x和y为外部变量
extern int x;
extern int y;
//给外部变量(全局变量)x和y赋值
x=1;
y=2;
return x+y;
}
int main(){
int result;
//调用函数addtwonum
result=addtwonum();
printf("result 为: %d", result);
return 0;
}
extern int a; //声明一个全局变量a
int a; // 声明并定义一个全局变量a
extern int a=0; //声明并定义一个全局变量a并给初值
int a =0; //定义一个全局变量a并给初值
- 声明之后不能直接使用这个变量,需要定义之后才可以使用。
- 定义才会分配存储空间
- int a;或者int a=0;这样的定义都只能出现一次,而extern int a;可以出现多次
- 当要引用一个全局变量的时候,要声明extern int a;这时候extern 不可以省略,省略之后变成int a; 这是一个定义加声明,不是单纯的声明。
四. 全局变量和局部变量在内存中的区别
- 全局变量保存在内存的全局存储区内,占用静态的存储单元
- 局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元