啊C啊C我爱你-3
C++软件与嵌入式软件面经解析大全(蒋豆芽的秋招打怪之旅)
本章讲解点
1.1 熟悉的陌生人——main函数
1.2 If else——易错细节分辨
1.3 Switch、break——相爱相杀的故事
1.4 For、while、do-while——傻傻分不清楚
1.5 枚举
1.6 结构体与共用体
1.7 函数——原来你是这样的函数
1.8 全局变量与静态变量详解
1.9 数据类型详解
1.10 类型转换
1.11 谁先谁后——把人搞疯的优先级
1.12 震惊——位运算还可以这样用
1.13 面试技巧讲解
1.14 数组指针与指针数组
1.15 指针与字符串
1.16 指针与函数
1.17 指针与结构体
1.18 内存布局
1.19 野指针与内存泄露
1.20 野指针与内存申请
1.21 内存碎片
受众:本教程适合于C/C++已经入门的学生或人士,有一定的编程基础。
本教程适合于互联网、嵌入式软件求职的学生或人士。
故事背景
蒋 豆 芽:小名豆芽,芳龄十八,蜀中人氏。卑微小硕一枚,科研领域苟延残喘,研究的是如何炒好一盘豆芽。与大多数人一样,学习道路永无止境,间歇性踌躇满志,持续性混吃等死。会点编程,对了,是面对对象的那种。不知不觉研二到找工作的时候了,同时还在忙论文,豆芽都秃了,不过豆芽也没头发啊。
隔壁老李:大名老李,蒋豆芽的好朋友,技术高手,代码女神。给了蒋豆芽不少的人生指导意见。
导 师:蒋豆芽的老板,研究的课题是每天对豆芽嘘寒问暖。
故事引入
导 师:豆芽,去教务处跑下账,最近的账都要报销一下。
蒋 豆 芽:好的(豆芽脸上笑嘻嘻(#^.^#))
导 师:别忘了你的论文,我们要赶紧搞。
蒋 豆 芽:好的(豆芽心里哭唧唧o(╥﹏╥)o)
蒋豆芽悄悄点开网页,进入面试链接,今天面试京西,是豆芽很想去的公司,刚把跌!豆芽上周跟老李学了一通C语言细节。哼,现在面试那还不是小case?哈哈,冲!
(蒋豆芽开始进入紧张的面试中。。。。。。)
1.13 面试技巧讲解
面 试 官:蒋豆芽啊,你好,请自我介绍一下。
蒋 豆 芽:阿巴阿巴阿巴。。。。。。
面 试 官:(微微点头)豆芽,请问你熟悉数组和指针吗?
蒋 豆 芽:(自信侃侃而谈)当然。数组是相同类型数据的集合。
(继续侃)引入数组就不需要在程序中定义大量的变量,大大减少了程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系。
(不停延伸)许多好的算法都与数组有关,如洗牌算法、冒泡排序等。同时数组也是一种数据结构,它的特点就是可以常数时间复杂度O(1)地访问元素,但是插入与删除元素是O(n)的时间复杂度,所以当需要频繁插入删除元素时,尽量不用数组,或对数组进行一些改进优化,比如C++ vector容器就是在数组的基础上进行改进优化,提高了数组操作效率。
蒋 豆 芽:指针也是一种变量,但它和普通的变量的区别是,普通的变量存放的是实际的数据,而指针变量包含的是内存中的一块地址,这块地址指向某个变量或者函数。
指针是C/C++语言的核心的概念,大大提高了程序的灵活性,但是同时也隐藏着危机,如内存泄露、非法内存访问、野指针等。所以为了规避这些问题,在后来的C++11引入了智能指针帮助程序员(点到为止,不继续延伸)。
蒋 豆 芽:(面试技巧一:熟悉的知识可以多说点。有几点好处:
一、面试是有一定的时间的,你熟悉的知识多说点,费的时间就多点,面试官后面问到你不会的问题的概率就小了啊。
二、面试本身就是试探的过程,面试官由浅及深问问题来测试你的基础,但是我们由浅及深自己全说出来,不仅减轻面试官的工作(谁又想费脑呢),而且充分展示出自己的实力,容易得到面试官的好评。
三、起到一个引导的作用,比如我回答指针这个问题,我延伸到了智能指针,然后面试官大概率会接着智能指针继续问问题,这样不就把面试官引导向我们熟悉的知识了吗?哈哈。
但是这样也有一个不好的地方,有些面试官自己有准备问题,那么在规定的时间内面试官是打算把他准备的问题问完的,但是我们如果说多了,面试官就问不完了,面试官很可能会打断我们,这样不是特别好,所以这个技巧要看情况使用,根据豆芽的经验,一般电话面试,面试官是有准备问题的,所以我们就点到为止。)
面 试 官:(不停点头,面露微笑)豆芽的基础还是很不错的。那请问数组指针和指针数组的区别。
蒋 豆 芽:(啥?什么组?什么针?)(依然自信)指针数组是多个指针变量,以数组的形式存储在内存中。而数组指针不太确定,但是我可以说一下自己的理解吗?
面 试 官:当然,你可以试着推测一下。
蒋 豆 芽:根据字面意思,数组指针可能也是一个指针变量,而它指向了一个一维数组。
蒋 豆 芽:(面试技巧二:会的知识自信答出来,不会的知识可以直接说不知道,不确定的知识点可以推测推测。
面试真的一定要自信,少用“可能”,“但是”,多用“就是”,“是的”。不会的知识说明超出我们的储备范围了,不是广就是深,如果不会也不用担心,因为有些题可能是面试官的附加题或灵光一闪想到的问题,两三个问题不会,并不会特别影响最后的面试结果,所以不要因为一两个问题不会就自乱阵脚了,还是要自信,不会的问题我们就说不会,用不着去猜或者强行解释,强词夺理会给面试官留下不好的印象。
而有些问题虽然我们不确定,但是通过一些逻辑可以推测出来,这时我们可以跟面试官说:这个我不确定,但是我可不可以根据逻辑说一下自己的理解。这样的回答会留给面试官正面的印象,知识不知道很正常,而具备逻辑思考能力,这也是面试官看重的素质。)
面 试 官:(满意点头)是这样的。那请问下面1、2、3、4哪些操作是合法的。
#include <stdio.h> #include <stdlib.h> using namespace std; int main() { int (*p)[4]; int a[3][4]; p = a; *(p[2] + 1) = 2; //1 *(*(p + 2) + 1) = 2; //2 (*(p + 2))[1] = 2; //3 p[2][1] = 2; //4 printf("*(p[2]+1) = %d\n", *(p[2] + 1)); printf("*(*(p+2)+1) = %d\n", *(*(p + 2) + 1)); printf("(*(p+2))[1] = %d\n", (*(p + 2))[1]); printf("p[2][1] = %d\n", p[2][1]); system("Pause"); return 0; }
蒋 豆 芽:(一脸懵懂)4肯定是对的,1、2、3这样的操作很少见,不清楚是否合法。
面 试 官:请问下面四条语句有什么区别?
char str[] = "I am jiangdouya."; char *str1 = "I am in Douya University."; char *str2[] = { "I am a master." }; string str3 = "Douya loves you!";
蒋 豆 芽:str
是字符串数组,str1
是指针变量,指向字符串常量,str2
指针变量,指向字符串数组,str3
是一个字符串变量,str3
是C++的string
类型数据。
面 试 官
蒋 豆 芽:阿巴阿巴阿巴。。。。。。
面 试 官:行,那我们的面试就结束了,后面有消息会通知你的。
蒋 豆 芽:(面试技巧三:如果面试到了反问的阶段,说明面试官评价是正面的,要是负面的话,面试官其实没啥耐心再反问了。那么这里反问的问题要注意一下,多问点有意义的、容易回答的问题,
比如我常问的两个问题:(1)这个职位具体负责什么业务。(2)你们的新人培训机制是怎样的。
切记,不要问薪资,太露骨了,薪资是hr面谈的事情,不要和技术面试官谈这些,
还有不要问无意义的问题,比如我遇见有个同学问面试官:疫情期间,你为什么不戴口罩。(面试官当时就很尴尬)
多问些职位相关的,公司相关的问题,容易回答,也表现出你的关切。这样面试在轻松的氛围里结束就挺好的。)
蒋豆芽还是比较满意自己的这次面试,但是豆芽依然没有忘记复盘,认真复盘才会进步!
1.14 数组指针与指针数组
蒋 豆 芽:老李,我今天面试京西,感觉还不错啊,主要问了数组与指针,感觉细节很多,概念不容易理解,很容易混淆,老李,你给我讲讲吧。
隔壁老李:(会心一笑)不错啊,豆芽,知道复盘哈,是的,指针是C语言的精髓,但却是没那么容易理解,比如数组指针和指针数组的区别。那么我们来着重讲讲吧。
隔壁老李:豆芽,你再总结一下数组和指针吧。
蒋 豆 芽:没问题。先说数组。
一组数据的集合称为数组(Array),它所包含的每一个数据叫做数组元素
int a[4];
在内存中分配了4个类型的内存空间,共 4×4=16 个字节,并为它们起了一个名字,叫。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> - 本专刊适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专刊适合于互联网C++软件开发、嵌入式软件求职的学生或人士。 - 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构等一系列知识点的讲解,并且最后总结出了高频面试考点(附有答案)共近400道,知识点讲解全面。不仅如此,教程还讲解了简历制作、笔试面试准备、面试技巧等内容。 </p> <p> <br /> </p>