1、#include"" 与#include <>的区别?
include<>到系统指定目录寻找头文件,#include ""先到项目所在目录寻找头文件,如果没有找到,再到系统指定的目录下寻找
2、描述一下gcc的编译过程?
gcc编译过程主要包含分为了4个阶段,分别是预处理、编译、汇编、链接。
预处理:处理所有#号开头的指令,比如:头文件的引入、条件编译、宏定义的替换、将注释的部分去掉,这里是将.c源文件转化为.i的预处理源文件,例如hello.c -> hello.i
编译:进行词法、语法、语义分析等,如果没有错误,这里将会把预处理好的.i文件转化为.s的汇编源文件,例如hello.i -> hello.s
汇编:将.s汇编文件转换成 .o的二进制目标文件,例如hello.s -> hello.o
链接:将项目中的各个二进制.o文件+所需的库+启动代码链接成可执行文件
多说一句:在这里hello.c、hello.i、hello.s 都是文本文件,可以用记事本之类的打开,而.o和最终生成的可执行文件,已经是二进制文件了,用记事本打开是乱码,没办法查看
3、c语言中有符号和无符号的区别?
- 有符号:数据的最高位为符号位,1表示的是负数,0表示正数
- 无符号:数据的最高位不是符号位,所有的位都是数值位,只有正没有负
4、计算机中补码的意义是什么?
- 将符号位与其他位统一处理
- 将减法运算转换成加法运算
5、内存的最小的存储单位,以及内存的最小计量单位分别是?
内存的最小存储单位是二进制位的形式, 内存的最小计量单位是字节(一个字节为8位)
6、数组有哪些重要的特点?
- 数组内的所有的成员都具有相同的数据类型
- 数组内的所有的成员在内存中的地址是连续的
7、变量的命名规则是什么?
- 变量名可以由字母、数值、下划线组成。
- 可以以下划线和字母开头,但是不可以以数值开头。
8、变量的声明与定义有啥区别?
声明变量是不需要创建和分配给变量存储空间的, 而变量的定义需要开辟内存空间,并且分配给它
9、普通局部变量、普通全局变量、静态局部变量、静态全局变量的区别
普通局部变量: 是存放在栈里面的、如果不初始化的话,其值是随机的、只在其所在的函数内或者花括号内有效,出栈后变量被销毁。
- 普通全局变量 :是存放在栈里面的、如果不初始化的话,其值为0、进程结束,该变量所占的空间才会被释放,能被当前源文件或其他源文件使用,只是其他源文件使用的时候,需要使用extern进行修饰。
- 静态局部变量: 是存放在全局区里面的、如果不初始化的话,其值为0、整个进程结束后,其所占的空间才被释放,只能在定义所在的复合语句中有效。
- 静态全局变量 :是存放在全局区里面的、如果不初始化的话,其值为0,整个进程结束空间才被释放,只能被当前源文件使用。
10、32位和64位平台下,指针所占空间的大小
- 32位平台:任意类型的指针大小为4字节
- 64位平台:任意类型的指针大小为8字节
11、静态数组和动态数组的区别。
- 静态数组:在程序运行就确定了数组的大小,例如int array[10],在数组被定义的时候,数组大小就已经固定下来了,运行过程中,不能更改数组的大小。
- 动态数组:是通过malloc等函数进行申请的,申请到的是堆空间,数组的大小是可以在程序运行过程中确定的。
12、简单描述一下指针是什么?
指针:指针即使地址也是变量,在C语言中内存单元的地址叫指针,同时C语言里还有一种变量叫指针,其内部存放的是其指向的变量的地址。
13、函数指针和指针函数的区别
简单地说:
- 函数指针本质上是一个指针,其指向的是一个函数代码的首地址,指向的是一个函数;
- 指针函数本质上是一个函数,其返回值是一个指针
14、文件的分类
文件分为二进制和文本文件
- 二进制文件基于值编码,需要根据具体的应用才能知道某个值具体的含义,用记事本打开是一对的乱码,因为它不是基于字符编码的。
- 文本文件基于字符编码,是可以通过记事本打开的。
15、当结构体中有指针成员的时候,容易出现浅拷贝与深拷贝的问题
浅拷贝:两个结构体变量的指针成员,指向同一块堆区空间,在各个结构体变量释放的时候,会出现多次释放同一段堆区空间。
深拷贝:让两个结构体变量的指针成员,分别指向不同的堆区空间,只是空间内容拷一份,这样在各个结构体变量释放的时候,就不会出现多次释放同一段堆区空间的问题。
16、什么叫宏函数,其作用是什么?
我们经常把一些短小而又频繁使用的函数,会写成宏函数,这是由于宏函数没有普通函数参数压栈、跳转、返回等的开销,可以调高程序的效率。 宏通过使用参数,可以创建外形和作用都与函数类似地类 函数宏。 宏的参数需要圆括号括起来,来保证宏函数的完整性。
17、如何理解库函数?
库是已经写好的、成熟的、可复用的代码。每个程序都需要依赖很多底层库,在实际项目开发的过程中,不可能每个人的代码都从零开始编写代码,因此库的存在具有非常重要的意义。
在我们的开发的应用中经常有一些公共代码是需要反复使用的,就把这些代码编译为库文件。 库可以简单看成一组目标文件的集合,将这些目标文件经过压缩打包之后形成的一个文件。
像在Windows这样的平台上,最常用的c语言库是由集成按开发环境所附带的运行库,这些库一般由编译厂商提供。
18、结构体与共用体的区别是什么?
- 结构体中的所有成员都拥有独立的空间
- 共用体的成员共享同一块空间,而每个共用体成员能访问共用区的空间大小,是由他们自身的类型来决定的。
19、什么情况下会出现野指针?
- 指针变量定义了,但是未初始化。
- 指针释放后未为置空
- 指针操作超越变量作用域
20、指针数组的概念
指针数组本质是数组,只是数组的每个元素是一个指针(地址)
我是小钱嵌入式,会不断地和大家分享嵌入式相关的内容,智能化时代的到来,促就了未来一定是个全民编程的时代,如果你觉得我的分享对你有所帮助,请不要吝惜你的点赞和关注原创写作不易,兄弟姐妹们的点赞和关注,就是我分享最大的动力,谢谢![谢谢],欢迎在评论区和我一起讨论。