面经宝典
- 第一部分:c语言基础考题
-
- 1.预处理
- 2. 关键字
- 3. 结构体
- 面试葵花宝典之结构体大小的计算方式
- ==注:面试官常问的C语言基本概念==
- 程序的内存分配
- 第二部分:数据结构常考知识
-
- 1、链表
- 2、排序
- 第三部分:Linux常考基础知识
-
- 1. Linux系统面试常考指令
- 2. Linux进程间通信
- 进程间通信——==五种通讯方式总结==
- 3. Linux进程(线程同步与互斥)
- 4、 Linux进程和线程的区别
- 5、 buffer和cache的区别
- 第四部分. 络通信应用
-
- TCP、UDP协议的区别:
- 第五部分.ARM体系架构
- 附录(一些公司的笔试题)
第一部分:c语言基础考题
1.预处理
1. 预编译,编译过程最先做的工作是啥/strong>
答:编译#字开头的指令,如
拷贝#include包含的头文件代码,#define宏定义的替换,条件编译ifndef
何时需要预编译 /strong>
答:
①总是经常使用但是不经常改动的大型代码。
②程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项,将所有包含文件预编译为一个 “预编译头”。
2. c语言中 # 与 ##的区别以及作用
答:
:把宏参数变成一个字符串;
:把两个宏参数连接到一起(只能两个)
例:
3.如何避免头文件被重复包含/strong>
答:解决方法:
应用
2. 关键字
1.static关键字的作用/strong>
答:static最主要功能是隐藏,其次因为static变量存放在静态存储区,具备持久性和默认值为0
①隐藏作用,可以在不同的文件中定义同名变量和同名函数。
②对于变量来说,保持变量持久,静态数据区的变量会在程序刚刚运行时就完成初始化,也是唯一一次初始化;储存在静态数据区,静态存储区只有两种变量(全局变量和static静态变量)。
③默认初始化为0x00,和全局变量一样的属性,减少程序员的工作量。
2.const关键字的作用
答:
①对变量加以限定不能被修改,常量必须在定义的时候同时被初始化。
②const和指针一起使用,
在三种情况中,第三种指针是只读的,p3本身的值不能被修改;
第一二种情况,指针所指向的数据是只读的,p1,p2的值可以修改,但指向的数据不能被修改。
③const和函数形参一起使用
使用const单独定义变量可以用#define命令替换,const通常放在函数形参中。
如果形参是一个指针,为了防止在函数内部修改指针指向的数据就可以用const来限制。
3.volatile关键字的作用/strong>
编译器优化的介绍: 内存访问速度远远比不上cpu处理的速度,为了提高性能,从硬件上引入高速缓存cache,加速对内存的访问。
编译优化的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指令流水线。
4.extern关键字的作用/strong>
答:
①函数内的局部变量,函数外定义的变量为全局变量,为静态存储方式,生存周期为整个程序,有效范围为定义变量的位置开始到本源文件结束。
如果在定义前想要引用该全局变量,则应该加上 extern作为 “外部变量声明”。
多个源文件的工程想要引用一个源文件的外部变量也只许引用变量的文件中加入extern关键字加以声明,但是可以在引用的模块内修改其变量的值,慎用。
②extern “C”: C++代码调用C语言代码。在C++的头文件中使用。
5.sizeof关键字的作用/strong>
答:sizeof 在 编译阶段处理,作用为取得一个对象(数据类型或数据对象)的长度(即占用内存的大小,以1字节为单位)。
①指针可以看做变量的一种,32位操作系统sizeof 指针都为4,例子:
②对于静态数组,sizeof可以直接计算数组大小,例:
③数组作为函数形参时候,数组名当做指针 使用,例:
④ sizeof 与 strlen 的区别:
3. 结构体
1.结构体的赋值方式:
①初始化:如:
②定义变量后按字段赋值,如:
③结构体变量的赋值,如:
2.结构体位域
位域类型: char、 short、int 可带上(signed或者unsigned)
位域的定义:
位域的好处:
①并不需要完整的字节,节省存储空间,处理简单;
②方便利用位域把一个变量按位域分解;
但是不利于程序的移植!!
3.计算一个结构体大小,sizeof(struct s1)
①结构体偏移量的概念:
结构体中的偏移量指的是一个成员的实际地址和结构体首地址之间的距离。
②结构体大小的计算方法:
结构体会涉及到字节对齐,(目的是为了让计算机快速读取,用空间交换速度),即最后一个成员的大小+最后一个成员的偏移量+末尾的填充节数。
③结构体内偏移规则
第一步:每个成员的偏移量都必须是当前成员所占内存大小的整数倍,如果不是整数倍,编译器会在前填充字节。
第二步:当所有成员大小计算完毕后,编译器会对当前结构体大小是否是最宽的结构体成员的大小的整数倍,如果不是整数倍,编译器会填充字节。
例:
sizeof(s1)=24+1+7(填充字节)
4.结构体成员数组大小
①
sizeof(st_t) = 8
②
sizeof( book ) = 12;
sizeof (book[2]) = 24;

第一步:结构体成员占字节数族大的元素为 sizeof ( float ) = 4;则用4 来分配其他成员;
第二步:数组超过四个字节,换行继续,剩下是哪个字节不够float型数据使用,则换行。
如果还不清楚,看下面的详细案例:
面试葵花宝典之结构体大小的计算方式
int : 4个字节
float: 4个字节
char: 1个字节
double:8个字节
在实际生活中,保存的数据一般不会是同一一种类型,所以引入了结构体。而结构体的大小也不是成员类型大小的简单相加。需要考虑到系统在存储结构体变量时的地址对齐问题。
由于存储变量地址对齐的问题,结构体大小计算必须满足两条原则:
一. 结构体成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
二. 结构体大小必须是所有成员大小的整数倍(数组 和 结构体 除外)。
三. 对齐方式很浪费空间 可是按照计算机对内存的的访问规则这样的对齐却提高了效率
练习一:
遵循结构体运算法制第一条,偏移量必须是当前成员变量的大小整数倍,逻辑 偏移2 实际按照对其的规则,要偏移4
这个结构体的大小容易计算,满足两个原则即可,为8
练习二:
这个结构体大小是12,为 么呢细看看两个原则,要满足偏移量是成员的整数倍,ch1偏移量是0 ,i的偏移量不可能是1,因为1不是i大小4的倍数,所以i的偏移量是4,ch2的偏移量就变成了8,所以为了满足结构体大小是成员大小整数倍,就是12;
练习三:成员包含数组的结构体
这个结构体的大小是20,先看前两个成员,大小是8,毋庸置疑,这个char类型的数组,只需要把它看做成十个char连在一起即可,加起来就是18,在满足结构体大小为成员整数倍,所以大小就是20;
练习四:成员包含结构体的结构体
这个内嵌的结构体的大小是8,那么是否结构体大小就要向8对齐/p>
这个结构体大小是12,为什么看这是20,确是12呢,因为内嵌的结构体它只是声明,不占空间。只是作为一个代码,所以是不算它的大小。
若代码改为
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!