程序运行过程如下:
预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)
编译, 检查语法,生成汇编 ( test.s main .s)
汇编, 汇编代码转换机器码 (test.o main.o)
链接 链接到一起生成可执行程序 a.out
1、由.c文件到.i文件,这个过程叫预处理。
2、由.i文件到.s文件,这个过程叫编译。
3、由.s文件到.o文件,这个过程叫汇编。
4、由.o文件到可执行文件,这个过程叫链接。
1. 限定符
extern 声明一个变量表明该变量已经被别处定义,在此处引用,不开辟空间。
static 静态修饰,static修饰的变量无法被外链调用,即不可被extern 声明,作用域只在本文件。
const 修饰的变量不能修改。
volatile 防止编译器优化。
2. 数组
一维数组数组名:
int a[5];
数组名a代表数组,也是数组第一个元素的地址,所以说数组名是一个常量(不可赋值)。
&a 整个数组的地址。
&a、a、&a[0]在数值上是相等的。
&a+1 跨度是5个元素,a+1跨度是一个元素。
二维数组数组名:
int a[2][3];
a代表整个数组,也代表数组第一行元素的地址。a+1跨度是3个元素
&a代表整个数组的地址 &a+1跨度是6个元素
a[0]代表第0行一维数组的数组名。
3. strlen和sizeof的区别
strlen可以测量字符串的有效字符个数,sizeof得到的结果是占有的内存大小。
4.防止头文件重复包含
#ifndef
#define
#endif
5.指针
野指针:指向非法空间的指针,比如没有初始化的指针,或者指针指向被释放的内存。
万能指针 void* 可以保存任意的地址。
数组指针 int (*p)[4],也称为行指针。
指针数组 int **k,或者 int *num[3];
指针作为函数形参,可以改变实参的值。
数组作为函数的形参,会退化为指针。
指针作为函数返回值不能返回普通局部变量的地址,因为局部变量在函数结束之后会被释放。
字符数组和字符指针和字符常量的区别:
char a[] = "hello"; //存放在栈区
char *p = a;
p = "hello"; //字符串常量存在文字常量区不可改变
字符串处理函数(库函数了解)
6.内存管理
内存分为五个区域:
代码区、堆区、栈区、静态全局区,文字常量区。
malloc和free成对使用。
内存泄漏:内存申请没有释放,导致内存泄露。
操作内存的一些函数:。。。。。
7.复合类型
结构体共用体
结构体的内存对齐。
8.标准文件
一些文件操作的函数。
网友评论