啊C啊C我爱你-1
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++已经入门的学生或人士,有一定的编程基础。
本教程适合于互联网、嵌入式软件求职的学生或人士。
故事背景
蒋 豆 芽:小名豆芽,芳龄十八,蜀中人氏。卑微小硕一枚,科研领域苟延残喘,研究的是如何炒好一盘豆芽。与大多数人一样,学习道路永无止境,间歇性踌躇满志,持续性混吃等死。会点编程,对了,是面对对象的那种。不知不觉研二到找工作的时候了,同时还在忙论文,豆芽都秃了,不过豆芽也没头发啊。
隔壁老李:大名老李,蒋豆芽的好朋友,技术高手,代码女神。给了蒋豆芽不少的人生指导意见。
导 师:蒋豆芽的老板,研究的课题是每天对豆芽嘘寒问暖。
故事引入
导 师:豆芽,这篇稿子审好今晚给我。
蒋 豆 芽:好的(豆芽脸上笑嘻嘻(#^.^#))
蒋豆芽悄悄点开邮件,今晚面试海平面,豆芽可不敢掉以轻心。豆芽针对岗位要求的C语言狠狠恶补了一通。哼,看我豆芽怎么在线吊打面试官!!!
面 试 官:蒋豆芽啊,你好,请自我介绍一下。
蒋 豆 芽:阿巴阿巴阿巴。。。。。。
面 试 官:你说你熟悉C语言哈,你来说说main函数的参数int argc
,char* argv[]
分别代表什么意思?
蒋 豆 芽:emmmm
面 试 官:不会的吗?(微笑浅露)那换个题吧,我们来复盘一下你的笔试题,有一道题目是这样的,你还记得最后i
和j
输出是多少?
int main(){ int i = -1, j = 2; if (i > 0) if (j > 3) i++; else j++; i -= j; }
蒋 豆 芽:(支支吾吾)emmm,有点记不清了,我看像-4
和3
面 试 官:(不置可否,笑容逐渐邪魅)我记得还有一道,你等等,对了,是这道,还记得最后result
输出是多少吗?
int main(){ int i = 2; int result = 0; switch (i) { case 1: result = result + i; case 2: result = result + i * 2; case 3: result = result + i * 3; } }
蒋 豆 芽:这个我知道嘛,是4
!
面 试 官:(无言以对)你觉得上面代码哪里需要改进?
蒋 豆 芽:(疑惑)我看看哈,哪里需要改进?emmmm
面 试 官:(无言以对)豆芽,回去等通知吧,有消息会联系你的。
经过惨烈吊打,蒋豆芽当然不会收到任何消息,蒋豆芽感觉自己好像并不会C语言了。
蒋 豆 芽:(委屈)老李,我明明学过C语言,怎么感觉还是不会啊。
隔壁老李:因为一门语言入门很简单,但是要掌握其所有语言细节,却并非易事,这需要时间以及对语言的深入学习,只有掌握了语言的细节,才可以自信的说自己精通了一门语言。面试笔试常考这一类语言细节题,你掌握了语言细节,那么你就拉开了和别人的差距,细节决定成败啊。
1.1 熟悉的陌生人——main函数
隔壁老李:我们来复盘一下你的问题。main
函数是我们最熟悉的函数,我们学习C语言,就是在main
函数里写下了“hello world!”
,但是main
也是可以带参数的,常有两个参数,一个是int argc
, 一个是char* argv[]
,而这个在我们看来就很陌生,所以main
函数还真是熟悉的陌生人啊。
蒋 豆 芽:那这两个参数是用来干嘛的啊?
隔壁老李:第一个参数,int
型的argc
,为整型,用来统计程序运行时发送给main
函数的命令行参数的个数。
第二个参数,char*
型的argv[]
,为字符串数组,用来存放指向字符串的指针元素,每一个指针元素指向一个字符串参数。各成员含义如下:
argv[0]
指向程序运行的全路径名argv[1]
指向在DOS命令行中执行程序名后的第一个字符串argv[2]
指向执行程序名后的第二个字符串。。。。。。
argv[argc-1]
指向执行程序名后的最后一个字符串argv[argc]
为NULL
蒋 豆 芽:(一脸疑惑)我们平时都是使用不带参数的main
函数,那带参数的main
函数又有什么作用呢?
隔壁老李:带参数的main
函数可以通过使用命令行的方式来调用exe执行文件,并传入参数,这是linux操作系统下常见的调用程序的方式,我们通过命令行传入参数,那么某些关键的参数不用固定死,这样程序灵活性大大增强。下面我们通过一个例子来感受一下带参数的main
函数如何使用。
隔壁老李:我们给出一个典型的例子
int main(int argc, char ** argv){ int i; for (i = 0; i < argc; i++) printf("Argument %d is %s\n", i, argv[i]); return 0; }
然后我们编译生成执行文件
隔壁老李:接着,我们打开命令行窗口,切换目录到我们的执行文件的目录下,我们输入参数:
"ConsoleApplication5.exe" a b c d
然后回车,就可以看到下面结果。
输出的就是我们输入的参数,那么我们输入的参数就可以人为定义,而main
函数里就可以通过分支语句来处理不同的参数形式,使得我们的程序灵活性大大增强。
蒋 豆 芽:原来是这样啊,懂了,带参数的main
函数和不带参数的main
函数有着各自的适用场景,特别是在Linux操作系统下,带参数的main
函数是很常见的形式。(有点激动)那老李,面试官问我的第二道题是怎么回事啊?我感觉自己应该没说错啊。不就是if-else
简单分支语句,这我还能出错?
1.2 If else——易错细节分辨
隔壁老李:我们来看看第二题。
int main(){ int i = -1, j = 2; if (i > 0) if (j > 3) i++; else j++; i -= j; }
if-else分支语句是C语言程序中必不可少的组成,理解清楚细节很有必要。If-else注意两个原则:
- if-else最近匹配原则:else与其上面最近的一个if语句配对。
- 如果没有大括号,if-else的作用域仅仅是紧跟的第一条语句。
按照这两个原则,我们重新编排一下格式。
1. int main(){ 2. int i = -1, j = 2; 3. if (i > 0) 4. if (j > 3) 5. i++; 6. else 7. j++; 8. i -= j; 9. }
你看这时我们的程序就很清晰了,那么程序的运行路径就应该是1->2->3->8,所以最后的输出是i=-3
,j=2
。那么豆芽,考考你,如果初始值i=1
,j=2
,程序的运行路径是如何的?
蒋 豆 芽:如果i=1
,那么会走到4这里,按照第一条原则,else
就近匹配,所以j=2
,会运行到7这里,按照第二条原则,只有一条语句属于else
的作用域,即j++
这条语句,所以程序继续运行到8这里。最终整个运行的路径应该是1->2->3->4->6->7->8。最后的输出是i=-2
,j=3
隔壁老李:bingo!豆芽聪明!那豆芽看看下面一题是这么做的呢?
1. int main(){ 2. int i = 1, j = 4; 3. if (i > 0) 4. if (j > 3) 5. i++; 6. else{ 7. j++; 8. i -= j; 9. } 10. }
蒋 豆 芽:我们重新编排一下格式:
1. int main(){ 2. int i = 1, j = 4; 3. if (i > 0) 4. if (j > 3) 5. i++; 6.
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> - 本专刊适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专刊适合于互联网C++软件开发、嵌入式软件求职的学生或人士。 - 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构等一系列知识点的讲解,并且最后总结出了高频面试考点(附有答案)共近400道,知识点讲解全面。不仅如此,教程还讲解了简历制作、笔试面试准备、面试技巧等内容。 </p> <p> <br /> </p>