C语言的运行过程 |
1、预处理 在这一阶段,源码中的所有预处理语句得到处理,例如:#include语句所包含的文件内容替换掉语句本身,处理宏定义;以及语法检查 GCC预处理阶段可以生成.i的文件,通过选项-E可以使编译器在预处理结束时就停止编译。例如:gcc -E -o hello.i hello.c 2、编译 这一阶段,编译器对源码进行词法分析、语法分析、优化等操作,最后生成汇编代码。这是整个过程中最重要的一步,因此也常把整个过程称为编译。 可以通过选项-S使GCC在进行完编译后停止,生成.s的汇编程序。例如:gcc -S -o hello.s hello.c 3、汇编 这一阶段使用汇编器对汇编代码进行处理,生成机器语言代码,保存在后缀为.o的目标文件中。 当程序由多个代码文件构成时,每个文件都要先完成汇编工作,生成.o目标文件后,才能进入下一步的链接工作。 目标文件已经是最终程序的某一部分了,只是在链接之前还不能执行。可以通过-c选项生成目标文件:gcc -c -o hello.o hello.c 4、链接 经过汇编以后的机器代码还不能直接运行。为了使操作系统能够正确加载可执行文件,文件中必须包含固定格式的信息头,还必须与系统提供的启动代码链接起来才能正常运行,这些工作都是由链接器来完成的。gcc -o hello hello.c |
C语言自动类型转换规则 |
参数转换的类型不同,先转换成相同类型再计算 数据类型向长度增长的方向转换:char->short->int->unsigned int->long 所有的float都会转换成double计算,哪怕只有一个float 赋值运算时,赋值号右边的类型向左边类型转换 浮点数和整形数,整形数向浮点数转换 在表达式,如果char和short类型值进行运算,无论char和short有无符号,结果都会转换成int 如果char或short与int进行计算,结果和init类型相同,即:如果int是有符号,结果就是带符号的,如果int是无符号,结果就是无符号 |
什么是构造函数 |
|
“-> ”在c语言中是什么意思? |
“->”在C语言中称为间接引用运算符,是二目运算符,优先级同成员运算符“.”。 用法: p->a,其中p是指向一个结构体的指针,a是这个结构体类型的一个成员。表达式p->a引用了指针p指向的结构体的成员a。 例如: struct T { int a; char b; }s; struct T* p=&s; 那么, p->a相当于s.a。 显然,有个等价写法:(*p).a,和p->a完全等效 |
register int i; |
Register声明的作用,告诉CPU把变量始终保存在寄存机里面,直到它消亡,现在编译器都很厉害,根本不需要这样申明 |
C语言内存分配模型 |
C语言把内存分为栈区、堆区,全局数据区、代码区 高地址 | 栈区:由编译器自动分配和释放 ,存放函数的参数值,局部变量的值等。其操作方式同数据结构中的栈(FILO) | unused | 堆区 :一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,存放malloc、new产生的对象 | 全局数据区:全局区数据区:全局数据区划分为三个区域。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。常量数据存放在另一个区域里。这些数据在程序结束后由系统释放。我们所说的BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称;static变量,全局变量(按定义的顺序排序)、一般常量、字符串常量[未初始化:bss段, 已初始化:data段] (const能提高内存地址存储顺序); | 代码区:存放函数体的二进制代码 | 低地址 |
!= |
不等于为1,继续执行语句;等于为0,结束或者跳过语句 |
!= EOF |
!=是不等于,EOF是为End Of File的缩写,它是文件结尾标志,所以意思是没有到文件结尾 EOF是一个计算机术语,在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字符表示资料结束。 |
define与const定义常量的区别 |
define定义常量没有数据类型,他定义的常量就是存文本数据,没有数据类型属性;define定义的常量在编译预处理时编译器会自动加上数据类型;定义形式:#define 常量名 值 const定义常量需要指明数据类型,const定义的常量在编译处理时起作用,const常量定义:const 数据类型 常量名 值 |
const、static、static const三者区别 |
const,只读的全局变量,其值不可修改. static,规定此全局变量只在当前模块(文件)中可见. static const,既是只读的,又是只在当前模块中可见的. |
C语言变量名 |
C语言在编译时会生成一个可执行文件和一个符号文件,可执行文件是程序的二进制代码,符号文件是程序中变量名和虚拟地址的对应关系,程序运行不需要此文件,此文件仅供调试使用 |
指针数据和数组指针的区别 |
指针数组:可理解为存储指针的数组,本质是个数组,数组里面的元素是指针,定义:int *P1[10],因为[ ]的运算优先级高于*,所以P1先和[10]结合,构成P1[10]组成数组,int * 修饰的是数组元素(指针)指向的数据类型为int, |
什么是ELF文件 |
ELF |
链接器 |
|
动态链接 |
|
静态链接 |
|
gcc编译器 |
GCC(GNU Compiler Collection)是由 GNU 开源开发的编程语言编译器。GCC支持C、 C++、Java 等多种语言 |
以C语言代码为例说明gcc变异过程 |
从 hello.c 到 hello.out)文件, 必须历经 hello.c(源代码文件)-> hello.i(预处理文件)->hello.s(汇编程序)->hello.o(可重定位目标程序,二进制)->hello.out(可执行目标文件,二进制),分别对应着预处理、编译、汇编和链接 4 个步骤 |
gcc test.c |
不加任何参数情况下,默认直接生成可执行目标文件test.out |
gcc -E test.c –o test.i |
只做预处理编译,-E:预处理参数;-o:另起名称 |
gcc -S test.i |
编译生成test.s的汇编文件 |
gcc -c test.s |
编译生成test.o的机器码二进制文件 |
gcc test.o |
编译生成test.out的可执行二进制文件 |