面经宝典
整理面试内容,看到实用好文就记录下来,以供学习,本文仅作导向文章,十分感谢各位博主大佬的文章,所列之处均已引用注明,再次感谢!另,以下说明注解均为浏览查找所得见解,内容多为文章晦涩难懂或者原文未给出的知识,比较菜,逐一贴出,增加了文章篇幅,望海涵!
C语言部分
感谢muxingyan博主的文章C语言面试题汇总(持续更)
-
括在一对双引号之内的字符序列或转义字符序列称为字符串常量,如“How are you!”,char *p=“ni hao!”,字符串常量是放在静态存储区,如果你试图改变指针所指向的内容是会报错的。如果想将一个字符串存放到变量中,必须使用字符数组,就是用一个字符型数组存放一个字符串,例如:char data[10]=“china”,这个字符数组存放了一个字符串,它是可以改变的。
-
静态局部变量分配在data/bss段,static修饰的全局变量的连接属性是内连接,普通的是外连接,请参考c语言static关键字的理解
-
一般记为s=“a1a2…an”(n≥0),其中,s是串的名称,用双引号(有些书用单引号)括起来的字符序列是串的值,注意单引号不属于串的内容。对于串的顺序存储,有一些变化,串值的存储空间可在程序执行过程中动态分配而得。比如在计算机中存在一个自由存储区,叫做“堆”。这个堆可由C语言的动态分配函数malloc()和free()函数来管理。
-
const int * p1 = &i; //p1指向的值不能改变,p1可以改变(即地址可以变,数据不可以变) int * const p2 =&j; //p2本身的值(即指向的值的地址)不能改变
-
ifndef是 if not define 的缩写,一种宏定义。它是预处理功能中三种(宏定义,文件包含和条件编译)中的第三种–条件编译。请参考ifndef 的使用方法以及作用
-
关于引用:引用就是另外再起一个名字,就像是外号。比如我的名字叫木某某,同学们给我起了个外号叫大帅锅,那么在班上的时候 ,不管人们喊木某某还是喊大帅锅,我都知道是在叫我……(援引失落的凡凡 2009-11-20)
int i =1; int & j = i; //这是绑定,j和i是同一个东西了 int k = 3; j = k; //这是赋值,j和i都被改变成3
-
#include <> :到保存系统标准头文件的位置查找头文件,usr/include/或者/usr/local/include/ #include" ":查找当前目录是否有指定名称的头文件,然后再从标准头文件目录中查找。
-
c语言中 # 与 ##的区别以及作用
#是将输入参数加上""变为字符串,如,定义宏: #define p(s) put(#s) 使用宏p(hello world),则替换为: put("hello world") ## 是连接符号 如,定义宏: #define func(aa, bb, cc) aa##_##bb(cc) 则宏 func(average, sqrt, ref) 展开为 average_sqrt(ref)
-
volatile关键字:访问寄存器要比访问内存单元要快的多,编辑器会作减少存取的优化。
当使用volatile声明函数变量的时候,系统总是重新从它所在的内存读取数据。遇到这个关键字声明的变量,编译器对访问该变量的代码不再进行优化,从而提供对特殊地址的稳定访问; 如果不使用valatile,编译器将对所声明的语句进行优化,以免出错。 -
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。
-
局部变量可以与全局变量同名,只不过局部变量可以覆盖全局的,就是在局部变量的范围内全局变量不起作用,在特定作用域内,局部强过全局。
-
参考博文sizeof和strlen的用法
-
参考博文计算结构体的大小以及偏移量规则
-
break和continue的区别:break是直接结束循环,而continue是结束本次循环,执行下一次的循环
-
do{}while()语句的执行过程:先执行一次循环体,然后再检查条件是否成立,若成立,在执行循环体。
do{ }while( )语句至少要执行一次循环体。
while( ){ }语句:先判断条件是否成立,若成立再执行循环体。 -
两种死循环:
while( 1 ){ }
for( ; ; ){ }