编译器有哪些?
GCC、Clang、MinGW、MSVC
预处理、编译、汇编、链接四个步骤分别做了什么?
预处理:
1、将所有的#define删除,并展开所有的宏定义。
2、处理所有的预编译指令,例如:#if,#elif,#else,#endif等。
3、处理#include预编译指令,将被包含的文件插入到预编译指令的位置。
4、添加行号信息、文件名标识,便于调试。
5、删除所有的注释。
6、保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pargma指令来设定编译的状态或者是指示编译器完成一些特定的动作。
7、生成.i文件(包括去注释、宏替换、头文件展开、条件编译),编译生成的.i文件不包含任何宏定义,因为宏已经被展开,并且包含的文件已经被插入到.i文件中。
编译:
1、扫描、语法分析、语义分析、源代码分析、目标代码生成、目标代码优化。
2、生成汇编代码。
3、汇总符号。
4、生成.s文件。
汇编:
1、根据汇编指令和特定平台,把汇编指令翻译成二进制形式。
2、合并各个section,合并符号表。
3、生成.o文件。
链接:
1、合并各个.obj文件的section,合并符号表,进行符号解析。
2、符号地址重定位。
3、生成可执行文件。
原文链接:https://blog.csdn.net/code_lyb/article/details/107730817
数据类型
printf()的输出格式:
%d %ld %md int
%c char
%s %ms %-ms string
%f float
%lf double
%p 指针
%zu sizeof()返回值
...
sizeof()的使用
1、2、4、4、8、4、8
全局变量和局部变量同名,局部变量优先
extern修饰符的作用
常量
1、字面常量
2、const修饰的常变量
3、枚举常量
enum Sex {
MALE,FEMALE
};
enum Sex sex01 = MALE;
4、#define定义的标识符常量:必要时要使用括号!!!
字符串
以下两种初始化如果用%s打印字符会有什么不同?
char arr1[] = "abc";
char arr2[] = {'a','b','c'};
strlen()函数
转义字符
选择语句和循环语句
函数
数组
关键字typedef
关键字static
static修饰局部变量
static修饰全局变量:仅本源文件可以使用
static修饰函数:只能在所在的源文件内部调用
指针
第23课
内存
栈区:局部变量 函数的参数
堆区:动态分配的内存
静态区:全局变量 static修饰的静态变量
scanf函数不能读取空格和回车
const修饰符
const int num = 10;
int *p = #
*p = 20;
const int *p = #
//表示 指针指向内容不能改变 但是指针指向谁是可以改变的
//*p = 20;error
//p = &num2; ok
int * const p = #
//指针必须指向num变量 但num变量的值可以修改
//*p = 20; ok
//p = &num2; error