啊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++已经入门的学生或人士,有一定的编程基础。

本教程适合于互联网嵌入式软件求职的学生或人士。

img

故事背景

img

蒋 豆 芽:小名豆芽,芳龄十八,蜀中人氏。卑微小硕一枚,科研领域苟延残喘,研究的是如何炒好一盘豆芽。与大多数人一样,学习道路永无止境,间歇性踌躇满志,持续性混吃等死。会点编程,对了,是面对对象的那种。不知不觉研二到找工作的时候了,同时还在忙论文,豆芽都秃了,不过豆芽也没头发啊。

隔壁老李:大名老李,蒋豆芽的好朋友,技术高手,代码女神。给了蒋豆芽不少的人生指导意见。

导 师:蒋豆芽的老板,研究的课题是每天对豆芽嘘寒问暖。

img

故事引入

img

导 师:豆芽,去教务处跑下账,最近的账都要报销一下。

蒋 豆 芽:好的(豆芽脸上笑嘻嘻(#^.^#))

导 师:别忘了你的论文,我们要赶紧搞。

蒋 豆 芽:好的(豆芽心里哭唧唧o(╥﹏╥)o)


蒋豆芽悄悄点开网页,进入面试链接,今天面试京西,是豆芽很想去的公司,刚把跌!豆芽上周跟老李学了一通C语言细节。哼,现在面试那还不是小case?哈哈,冲!


(蒋豆芽开始进入紧张的面试中。。。。。。)

img

1.13 面试技巧讲解

img

面 试 官:蒋豆芽啊,你好,请自我介绍一下。

蒋 豆 芽:阿巴阿巴阿巴。。。。。。

面 试 官:(微微点头)豆芽,请问你熟悉数组和指针吗?

蒋 豆 芽:(自信侃侃而谈)当然。数组是相同类型数据的集合

(继续侃)引入数组就不需要在程序中定义大量的变量,大大减少了程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系。

(不停延伸)许多好的算法都与数组有关,如洗牌算法、冒泡排序等。同时数组也是一种数据结构,它的特点就是可以常数时间复杂度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面谈的事情,不要和技术面试官谈这些,

还有不要问无意义的问题,比如我遇见有个同学问面试官:疫情期间,你为什么不戴口罩。(面试官当时就很尴尬)

多问些职位相关的,公司相关的问题,容易回答,也表现出你的关切。这样面试在轻松的氛围里结束就挺好的。)


蒋豆芽还是比较满意自己的这次面试,但是豆芽依然没有忘记复盘,认真复盘才会进步

img

1.14 数组指针与指针数组

img

蒋 豆 芽:老李,我今天面试京西,感觉还不错啊,主要问了数组与指针,感觉细节很多,概念不容易理解,很容易混淆,老李,你给我讲讲吧。

隔壁老李:(会心一笑)不错啊,豆芽,知道复盘哈,是的,指针是C语言的精髓,但却是没那么容易理解,比如数组指针和指针数组的区别。那么我们来着重讲讲吧。

隔壁老李:豆芽,你再总结一下数组和指针吧。

蒋 豆 芽:没问题。先说数组

一组数据的集合称为数组(Array),它所包含的每一个数据叫做数组元素

int a[4];

在内存中分配了4个类型的内存空间,共 4×4=16 个字节,并为它们起了一个名字,叫。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

<p> - 本专刊适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专刊适合于互联网C++软件开发、嵌入式软件求职的学生或人士。 - 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构等一系列知识点的讲解,并且最后总结出了高频面试考点(附有答案)共近400道,知识点讲解全面。不仅如此,教程还讲解了简历制作、笔试面试准备、面试技巧等内容。 </p> <p> <br /> </p>

全部评论
大佬您好,在文中第二个代码段中指出char str[] = "I am jiangdouya.";  的str文中说是字符串数组,这应该是字符数组吧,毕竟是char类型的。那么char *str2[] = { "I am a master." };  中的str2就是指向字符数组的指针变量了吧!
2
送花
回复
分享
发布于 2021-06-29 09:02
指针真的好难啊
1
送花
回复
分享
发布于 2021-04-13 20:29
网易互娱
校招火热招聘中
官网直投
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。 感谢大佬让我知道GPIO是怎么设置的了
1
送花
回复
分享
发布于 2022-03-05 16:35
这小节内容挺多的啊,果然学了JAVA就把指针忘得一干二净了😅
3
送花
回复
分享
发布于 2021-04-08 13:55
您好,请问文中说char* str2[],str2指针变量,指向字符数组,存储于栈区中; char* str2[]不应该是一个指针数组么,存放的是指向字符类型的指针,str2确实是指针变量,但是指向的应该是一个指针数组把,str2 == &str2[0],str2存放的应该是这个指针数组的首地址,str2[0]存放的的是一个字符数组的首地址,所以是不是str2[0]指向的是一个字符数组,str2指向的是一个指针数组。
1
送花
回复
分享
发布于 2022-09-01 09:46 北京
哎呀,指针数组这个代码没看明白。。原文:这里int *p[3]表示一个一维数组内存放这3个指针变量,分别是p[0]、p[1]、p[2],所以要分别赋值。  所以我想 不是应该这么赋值嘛:*p[i] = a[i];    而原文是p[i] = a[i]; int a[3][4];  int *p[3];  for (int i=0; i<3; i++)      p[i] = a[i];
点赞
送花
回复
分享
发布于 2021-04-24 09:40
void qsort(void *base,//void*类型,代表原始数组            size_t nmemb, //第二个是size_t类型,代表数据数量            size_t size, //第三个是size_t类型,代表单个数据占用空间大小            int(*compar)(const void *,const void *)//第四个参数是函数指针 void * 是指任意类型指针都可以输入           );
点赞
送花
回复
分享
发布于 2022-03-09 09:36
想问一下豆芽,我看网上一些说法是,str1指针指向的字符串常量字面值是放在常量区的,或者说.rodata段的。和上面说的代码段有区别,想问问你怎么看?而且我看下一节的内存分布中没有讲到常量区或者.rodata段,是否这个段被包含被了代码段中?
点赞
送花
回复
分享
发布于 2022-07-28 14:11
关于指针函数,由于返回的是一个变量的指针,因此需要在指针函数里使用static修饰变量存在堆区,来避免栈区的变量在函数执行后就销毁的问题。
点赞
送花
回复
分享
发布于 2023-03-29 21:48 北京

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务