C语言基础
  CZHsu4xuhYFz 2023年11月02日 17 0

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的可执行二进制文件

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: 英语 下一篇: 工具快捷键
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

CZHsu4xuhYFz
作者其他文章 更多

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02