10.10-11.8号笔试面试总结
2013-11-08 19:13
239 查看
富士通笔试题:
第一次笔试:其中有很多C的基础题目都不会
1、 黑盒测试和白盒测试
黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
白盒测试:已知产品的内部工作过程,可以进行测试证明每种内部操作是否符合设计规格要求,所有内部成分是否经过检查。
2、 哈希表的填空题
3、 数列菲普那锲数列的递归和非递归实现
4、 链表的逆序
编程题没有做出来,这些都是最常见最基本的题
亚信联创:
这家公司要求可能比较高一点,去笔试的没有收到面试通知的,但他们的笔试题难度一般
有2个逻辑分析题1个是关于过桥问题 a 1s b 2 c5 d 10 如何在17s内全部通过
题2是有12个球其中有一个重量不同,三次称量确定那个重量不同的球
首先,把12个小球分成三等份,每份四只。
拿出其中两份放到天平两侧称(第一次)
情况一:天平是平衡的。
那么那八个拿上去称的小球都是正常的,特殊的在四个里面。
把剩下四个小球拿出三个放到一边,另一边放三个正常的小球(第二次)
如天平平衡,特殊的是剩下那个。
如果不平衡,在天平上面的那三个里。而且知道是重了还是轻了。
剩下三个中拿两个来称,因为已经知道重轻,所以就可以知道特殊的了。(第三次)
情况二:天平倾斜。
特殊的小球在天平的那八个里面。
把重的一侧四个球记为A1A2A3A4,轻的记为B1B2B3B4。
剩下的确定为四个正常的记为C。
把A1B2B3B4放到一边,B1和三个正常的C小球放一边。(第二次)
情况一:天平平衡了。
特殊小球在A2A3A4里面,而且知道特殊小球比较重。
把A2A3称一下,就知道三个里面哪个是特殊的了。(第三次)
情况二:天平依然是A1的那边比较重。
特殊的小球在A1和B1之间。
随便拿一个和正常的称,就知道哪个特殊了。(第三次)
情况三:天平反过来,B1那边比较重了。
特殊小球在B2B3B4中间,而且知道特殊小球比较轻。
把B2B3称一下,就知道哪个是特殊的了。(第三次)
银河笔试题:
70分的逻辑分析题和100分的C基础题
逻辑分析题全部抄袭东东的,自己就做了C的程序题
C中关于字节的大小问题,输出三层for循环实现的比较简单
逻辑题中有时事新闻题,这家公司面试会考虑时代新闻以及机顶盒,nandflash和norflash
冯依曼笔试题:
补码和反码的问题
25的二进制原码是00011001
25的补码,反码跟原码一样
负数的话
-25原码 1001 1001 (用首位数字为1,表示负数)
-25反码 1110 0110 (正数的原码制反)
-25补码1110 0111(反码的基础上,加1)
追问
恩 那就是正数的的反码补码原码都是一样咯? 那反码跟补码原码又有什么用处呢? 25二进制不是11001么???
回答
25的二进制是11001,但是8位2进制的话前面要补上0用来区别是否是负数(当然,无符号数的话就无所谓了)
引入反码补码是用来给计算机计算用的.
比如0的表示用原有的方法的话就有0000表示正数的0 , 1000表示负数的0,这样计算的话有两个0了,计算机无法计算.
二叉树的遍历已知反序后序求前序
昨晚HULU的笔试题之一,被鄙视的惨,面对向往已久的公司,交出苍白无力的答卷,心里像被剜了一刀。再多解释都是苍白。我鄙视我自己。现在开始舔舐伤口。)
假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道。
PreOrder: GDAFEMHZ
InOrder: ADEFGHMZ
PostOrder: AEFDHZMG
现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”应该如何求后续遍历?
第一步,root最简单,前序遍历的第一节点G就是root。
第二步,继续观察前序遍历GDAFEMHZ,除了知道G是root,剩下的节点必然是root的左右子树之外,没法找到更多信息了。
第三步,那就观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。
第四步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。
第五步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。在前序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的右子树的第一个节点就是右子树的根节点。
如何知道哪里是前序遍历中的左子树和右子树的分界线呢?通过中序遍历去数节点的个数。
在上一次中序遍历中,root左侧是A、D、E、F,所以有4个节点位于root左侧。那么在前序遍历中,必然是第1个是G,第2到第5个由A、D、E、F过程,第6个就是root的右子树的根节点了,是M。
第六步,观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。
第七步,其实,如果仅仅要求写后续遍历,甚至不要专门占用空间保存还原后的树。只需要稍微改动第六步,就能实现要求。仅需要把第六步的递归的过程改动为如下:
1 确定根,确定左子树,确定右子树。
2 在左子树中递归。
3 在右子树中递归。
4 打印当前根。
有C++的基本继承、虚函数知识但题目是英文描述没做
编写判断输入两个数,是否是平方的关系
联想笔试题:
这个选择题为主,有一个编程题考虑到强制类型转换的知识
就是把一个数字存放在一个地址中的题
中雷笔试题
1、 UDP和TCP的区别
2、 查找字串并返回其位置
3、 Linux命令 sed cat mov
4、 举例说明在调试bug是你用过那些调试方式
5、 概率问题 两个筛子,和为奇数的概率?
新模式笔试
他们公司主要是做windows编程的考的考试有内存管理用C++考的不会关于内存分配
其中简答题:对称加密和非对称加密以及常用算法
C++程序进入main函数之前,退出main函数之后会做些什么?
main函数执行之前,主要就是初始化系统相关资源:
1.设置栈指针
2.初始化static静态和global全局变量,即data段的内容
3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容
4.运行全局构造器,估计是C++中构造函数之类的吧
5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数
在调用main函数之前,会先进性初始化栈,堆,打开标准输入,输出,错误流,把参数压栈。还有一些全局变量、对象和静态变量、对象的空间分配和赋初值。
在调用main函数之后,要销毁堆内存,关闭标准输入,输出,错误流。
科达笔试题
感觉这个题虽然不难,但是让我答着很是伤脑子
C++的特性和你对每个特性的理解
0值判断
C语言BOOL值与零值判断的问题
①int型变量 n 与“零值”比较的 if 语句就是:
[cpp]
view plaincopy
if ( n == 0 )
[cpp]
view plaincopy
if ( n != 0 )
④请写出 char *p 与“零值”比较的 if 语句。
标准答案:
[cpp]
view plaincopy
if (p == NULL)
if (p != NULL)
Const的用法描述
你毕业设计的描述包括框图
用最优算法实现1-2+3-4.。。。。。
关于linux内核说说你的的了解
1、应用程序通过系统调用和内核通信来运行。应用程序通常调用库函数(c库函数),再由库函数通过系统调用界面让内核代其完成各种不同的任务。
2、内核的架构
系统调用接口、进程管理、内存管理、体系结构相关代码、设备驱动、网络协议栈、虚拟文件系统
3、内核空间与用户空间是程序执行的两种不同的状态、通过系统调用和硬件中断能够完成从用户空间到内核空间的转移
4、linux体系结构由内核空间和用户空间两部分组成,用户空间包含用户程序和c库;
内核空间包含内核、系统调用接口、体系结构相关代码。
5、中断上下文是为了保证中断服务程序能够在第一时间响应和处理中断请求,然后快速退出。
6处理器在任何指定时间点上活动范围在以下三种之一:
运行与内核空间,处于进程上下文,代表某个特定的进程执行。
运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。
运行于用户空间,执行用户进程。
7、单内核和微内核比较(linux内核是运行在单独的内核地址空间)
单内核:把它从整体上作为 单独的大过程来实现,并同时运行在一个单独的地址空间。内核之间通信微不足道,都是运行在内核态,都在同一地址空间,内核可以直接调用函数。
微内核的功能被划分为独立的过程,每个过程叫做一个服务器。所有的服务器都独立并行的运行在各自的地址空间,不能直接调用函数,需要通过消息传递机制处理微内核通信,各个服务器通过进程间通信机制互相传递消息,互换“服务”,这样可以避免一个服务器失效而祸及另一个。
内核源码一半安装在/usr/src/linux目录下
不能在内核中使用浮点数运算。
内核要求能够并发的访问共享数据,这就要求有同步机制来保证不出现竞
编程解析IP 192.168.1.2
中兴力维笔试题
这个考的比较全面
描述你人生生中遇到印象最深的困难如何面对的和收获
C++容器的知识编程
雨花台小公司面试:
问对自己在公司的定位
问毕业后的打算
问在无锡七芯实习后有何收获
聊聊大学生活
冯依曼面试
关于自己的定位
嵌入式软件开发,听从公司安排和对自己的要求,在公司我是个最基础的学习者和零起步的公司员工。
关于自己以后的打算留南京还是回家
毕业后我会在南京找个有上升空间和学习机会的公司不断地努力,让自己技术上有更高的成就。
关于在无锡七芯的收获
1、 公司做事情有规定,和时间限时,做事要和公司节奏一致
2、 公司做事情有些不懂要学会自己研究,不断地查资料,直到解决这个问题,而不是向学校那样,随意拖拖找找老师。
关于物联网的理解和现在应用
关于stm32的休眠模式有几种
关于串口配置的过程
七芯物联面试
上拉电阻的作用
推挽输出?
还有项目的描述以及自己技能
小公司的面试更关主你现在到公司能做什么,他们要的是直接能够做事情的人,回答问题的时候不要想着自己的学习能力和以后的社么,而是要多多表现自己现在能够做什么,能力很强。
江宁一家大公司面试
自我介绍一下,然后问自己擅长什么,比起别人有什么优势
我叫叶稳定,来自金陵科技学院,当初没有认清情况就说自己擅长嵌入式单片机开发,C编程,优势就是能够对嵌入式开发的整体流程有所了解,了解底层所以做软件开发会更有利。但是没有给我笔试的机会(公司招软件开发,先面试后笔试),总结:问题在与我应聘的岗位是软件开发,而我简历和我的表述上都显示出我的底层硬件和单片机等比较好,没有任何软件编程的能力突出,面试官当然就不会看中了。
新模式面试
关于操作系统内存管理文件管理,windows编程的了解,加密解密概念,项目的描述
这家公司主要做的是widnows上面的编程调用windos自带库api进行编程。5个人一起面试的,但是我的表现很一般,没有特别突出的回答,所以就2个去复试了,我没有复试,群体面试的时候不一定要说太多,但是自己熟悉的知识一定要回答好,让面试官有眼前一亮,留下印象,如果你什么都说几句又不全面,只能说嗯记得有这个人,但是么米有特别的,不会录用的。
给自己的建议:
自己的定位:要做软件开发
那就果断改简历,该思想,把自己的能力和技能和项目都表现出有很强的编程能力,有编程的经验。其他的能力对硬件的了解和单片机的熟悉都可以一带而过。
第一次笔试:其中有很多C的基础题目都不会
1、 黑盒测试和白盒测试
黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
白盒测试:已知产品的内部工作过程,可以进行测试证明每种内部操作是否符合设计规格要求,所有内部成分是否经过检查。
2、 哈希表的填空题
3、 数列菲普那锲数列的递归和非递归实现
4、 链表的逆序
编程题没有做出来,这些都是最常见最基本的题
亚信联创:
这家公司要求可能比较高一点,去笔试的没有收到面试通知的,但他们的笔试题难度一般
有2个逻辑分析题1个是关于过桥问题 a 1s b 2 c5 d 10 如何在17s内全部通过
题2是有12个球其中有一个重量不同,三次称量确定那个重量不同的球
首先,把12个小球分成三等份,每份四只。
拿出其中两份放到天平两侧称(第一次)
情况一:天平是平衡的。
那么那八个拿上去称的小球都是正常的,特殊的在四个里面。
把剩下四个小球拿出三个放到一边,另一边放三个正常的小球(第二次)
如天平平衡,特殊的是剩下那个。
如果不平衡,在天平上面的那三个里。而且知道是重了还是轻了。
剩下三个中拿两个来称,因为已经知道重轻,所以就可以知道特殊的了。(第三次)
情况二:天平倾斜。
特殊的小球在天平的那八个里面。
把重的一侧四个球记为A1A2A3A4,轻的记为B1B2B3B4。
剩下的确定为四个正常的记为C。
把A1B2B3B4放到一边,B1和三个正常的C小球放一边。(第二次)
情况一:天平平衡了。
特殊小球在A2A3A4里面,而且知道特殊小球比较重。
把A2A3称一下,就知道三个里面哪个是特殊的了。(第三次)
情况二:天平依然是A1的那边比较重。
特殊的小球在A1和B1之间。
随便拿一个和正常的称,就知道哪个特殊了。(第三次)
情况三:天平反过来,B1那边比较重了。
特殊小球在B2B3B4中间,而且知道特殊小球比较轻。
把B2B3称一下,就知道哪个是特殊的了。(第三次)
编程题:一只猴子摘了一堆桃,每天吃一半再加1个,第10天去吃时 只剩1个桃,问第一天的一堆桃有多少
每天的桃子数为:a10 = 1, a9 = (1 + a10) ×2, a8 = (1 + a9) × 2, … 递推公式:ai = (1 + ai+1) × 2,i = 9, 8, …, 1 #include <stdio.h> int main( ) { int s = 1, i; for (i = 9; i >= 1; -- i) s = (s + 1) * 2; printf("s=%d\n", s); }
银河笔试题:
70分的逻辑分析题和100分的C基础题
逻辑分析题全部抄袭东东的,自己就做了C的程序题
C中关于字节的大小问题,输出三层for循环实现的比较简单
逻辑题中有时事新闻题,这家公司面试会考虑时代新闻以及机顶盒,nandflash和norflash
冯依曼笔试题:
补码和反码的问题
25的二进制原码是00011001
25的补码,反码跟原码一样
负数的话
-25原码 1001 1001 (用首位数字为1,表示负数)
-25反码 1110 0110 (正数的原码制反)
-25补码1110 0111(反码的基础上,加1)
追问
恩 那就是正数的的反码补码原码都是一样咯? 那反码跟补码原码又有什么用处呢? 25二进制不是11001么???
回答
25的二进制是11001,但是8位2进制的话前面要补上0用来区别是否是负数(当然,无符号数的话就无所谓了)
引入反码补码是用来给计算机计算用的.
比如0的表示用原有的方法的话就有0000表示正数的0 , 1000表示负数的0,这样计算的话有两个0了,计算机无法计算.
二叉树的遍历已知反序后序求前序
昨晚HULU的笔试题之一,被鄙视的惨,面对向往已久的公司,交出苍白无力的答卷,心里像被剜了一刀。再多解释都是苍白。我鄙视我自己。现在开始舔舐伤口。)
假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道。
PreOrder: GDAFEMHZ
InOrder: ADEFGHMZ
PostOrder: AEFDHZMG
现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”应该如何求后续遍历?
第一步,root最简单,前序遍历的第一节点G就是root。
第二步,继续观察前序遍历GDAFEMHZ,除了知道G是root,剩下的节点必然是root的左右子树之外,没法找到更多信息了。
第三步,那就观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。
第四步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。
第五步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。在前序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的右子树的第一个节点就是右子树的根节点。
如何知道哪里是前序遍历中的左子树和右子树的分界线呢?通过中序遍历去数节点的个数。
在上一次中序遍历中,root左侧是A、D、E、F,所以有4个节点位于root左侧。那么在前序遍历中,必然是第1个是G,第2到第5个由A、D、E、F过程,第6个就是root的右子树的根节点了,是M。
第六步,观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。
第七步,其实,如果仅仅要求写后续遍历,甚至不要专门占用空间保存还原后的树。只需要稍微改动第六步,就能实现要求。仅需要把第六步的递归的过程改动为如下:
1 确定根,确定左子树,确定右子树。
2 在左子树中递归。
3 在右子树中递归。
4 打印当前根。
有C++的基本继承、虚函数知识但题目是英文描述没做
public继承(公有继承) 如类b是从类a通过公有继承过来的.那么类a的 1.公有成员在类b也将是公有成员. 2.保护成员在类b中将是保护成员. 3.私有成员在类B中将是私有成员.(不能访问类A的私有成员) 就好比儿子通过合法的手续来继承父亲的遗产一样,那肯定是原封不用拥有交亲的一切,但是父亲的一些私有成员(private)是儿子是不是访问的.比如父亲年轻时写给一些MM的情书是不折开来看的(即使他能替父亲保存一切私人物品). 搞懂了public继承下面的就简单了。 再看protected继承 1.公有成员成了类b的protected成员(谁叫它是protected 继承方式呢) 2.保护成员成了类b的protected成员(谁叫它是protected 继承方式呢,与上相同) 3.私有成员也成了类b的protected成员(不过子类b不能访问父类a的私有成员,也就是说虽然到了儿子手里是protected成员,但是不访问,儿子不管在何时何地都不能访问父亲的隐私的。) private继承也就更简单了。 1。不是类a成员是那一种,一律变成私有的(private)。 2.同样不访问父类的私有成员. 不过私继承用得比较少,因为父类一切成员到了子类中都是私有的了。好像也太自私了吧。
虚函数联系到多态,多态联系到继承。所以本文中都是在继承层次上做文章。没了继承,什么都没得谈。 下面是对C++的虚函数这玩意儿的理解。 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始) 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。下面来看一段简单的代码 class A{ public: void print(){ cout<<”This is A”<<endl;} }; class B:public A{ public: void print(){ cout<<”This is B”<<endl;} }; int main(){ //为了在以后便于区分,我这段main()代码叫做main1 A a; B b; a.print(); b.print(); } 通过class A和class B的print()这个接口,可以看出这两个class因个体的差异而采用了不同的策略,输出的结果也是我们预料中的,分别是This is A和This is B。但这是否真正做到了多态性呢?No,多态还有个关键之处就是一切用指向基类的指针或引用来操作对象。那现在就把main()处的代码改一改。 int main(){ //main2 A a; B b; A* p1=&a; A* p2=&b; p1->print(); p2->print(); } 运行一下看看结果,哟呵,蓦然回首,结果却是两个This is A。问题来了,p2明明指向的是class B的对象但却是调用的class A的print()函数,这不是我们所期望的结果,那么解决这个问题就需要用到虚函数 class A{ public: virtual void print(){ cout<<”This is A”<<endl;} //现在成了虚函数了 }; class B:public A{ public: void print(){ cout<<”This is B”<<endl;} //这里需要在前面加上关键字virtual吗? }; 毫无疑问,class A的成员函数print()已经成了虚函数,那么class B的print()成了虚函数了吗?回答是Yes,我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数。所以,class B的print()也成了虚函数。那么对于在派生类的相应函数前是否需要用virtual关键字修饰,那就是你自己的问题了。 现在重新运行main2的代码,这样输出的结果就是This is A和This is B了。 现在来消化一下,我作个简单的总结,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。 二, 虚函数是如何做到的(如果你没有看过《Inside The C++ Object Model》这本书,但又急切想知道,那你就应该从这里开始) 虚函数是如何做到因对象的不同而调用其相应的函数的呢?现在我们就来剖析虚函数。我们先定义两个类 class A{ //虚函数示例代码 public: virtual void fun(){cout<<1<<endl;} virtual void fun2(){cout<<2<<endl;} }; class B:public A{ public: void fun(){cout<<3<<endl;} void fun2(){cout<<4<<endl;} }; 由于这两个类中有虚函数存在,所以编译器就会为他们两个分别插入一段你不知道的数据,并为他们分别创建一个表。那段数据叫做vptr指针,指向那个表。那个表叫做vtbl,每个类都有自己的vtbl,vtbl的作用就是保存自己类中虚函数的地址,我们可以把vtbl形象地看成一个数组,这个数组的每个元素存放的就是虚函数的地址,请看图 通过上图,可以看到这两个vtbl分别为class A和class B服务。现在有了这个模型之后,我们来分析下面的代码 A *p=new A; p->fun(); 毫无疑问,调用了A::fun(),但是A::fun()是如何被调用的呢?它像普通函数那样直接跳转到函数的代码处吗?No,其实是这样的,首先是取出vptr的值,这个值就是vtbl的地址,再根据这个值来到vtbl这里,由于调用的函数A::fun()是第一个虚函数,所以取出vtbl第一个slot里的值,这个值就是A::fun()的地址了,最后调用这个函数。现在我们可以看出来了,只要vptr不同,指向的vtbl就不同,而不同的vtbl里装着对应类的虚函数地址,所以这样虚函数就可以完成它的任务。 而对于class A和class B来说,他们的vptr指针存放在何处呢?其实这个指针就放在他们各自的实例对象里。由于class A和class B都没有数据成员,所以他们的实例对象里就只有一个vptr指针。通过上面的分析,现在我们来实作一段代码,来描述这个带有虚函数的类的简单模型。 #include<iostream> using namespace std; //将上面“虚函数示例代码”添加在这里 int main(){ void (*fun)(A*); A *p=new B; long lVptrAddr; memcpy(&lVptrAddr,p,4); memcpy(&fun,reinterpret_cast<long*>(lVptrAddr),4); fun(p); delete p; system("pause"); } 用VC或Dev-C++编译运行一下,看看结果是不是输出3,如果不是,那么太阳明天肯定是从西边出来。现在一步一步开始分析 void (*fun)(A*); 这段定义了一个函数指针名字叫做fun,而且有一个A*类型的参数,这个函数指针待会儿用来保存从vtbl里取出的函数地址 A* p=new B; 这个我不太了解,算了,不解释这个了 long lVptrAddr; 这个long类型的变量待会儿用来保存vptr的值 memcpy(&lVptrAddr,p,4); 前面说了,他们的实例对象里只有vptr指针,所以我们就放心大胆地把p所指的4bytes内存里的东西复制到lVptrAddr中,所以复制出来的4bytes内容就是vptr的值,即vtbl的地址 现在有了vtbl的地址了,那么我们现在就取出vtbl第一个slot里的内容 memcpy(&fun,reinterpret_cast<long*>(lVptrAddr),4); 取出vtbl第一个slot里的内容,并存放在函数指针fun里。需要注意的是lVptrAddr里面是vtbl的地址,但lVptrAddr不是指针,所以我们要把它先转变成指针类型 fun(p); 这里就调用了刚才取出的函数地址里的函数,也就是调用了B::fun()这个函数,也许你发现了为什么会有参数p,其实类成员函数调用时,会有个this指针,这个p就是那个this指针,只是在一般的调用中编译器自动帮你处理了而已,而在这里则需要自己处理。 delete p;和system("pause"); 这个我不太了解,算了,不解释这个了 如果调用B::fun2()怎么办?那就取出vtbl的第二个slot里的值就行了 memcpy(&fun,reinterpret_cast<long*>(lVptrAddr+4),4); 为什么是加4呢?因为一个指针的长度是4bytes,所以加4。或者memcpy(&fun,reinterpret_cast<long*>(lVptrAddr)+1,4); 这更符合数组的用法,因为lVptrAddr被转成了long*型别,所以+1就是往后移sizeof(long)的长度 三, 以一段代码开始 #include<iostream> using namespace std; class A{ //虚函数示例代码2 public: virtual void fun(){ cout<<"A::fun"<<endl;} virtual void fun2(){cout<<"A::fun2"<<endl;} }; class B:public A{ public: void fun(){ cout<<"B::fun"<<endl;} void fun2(){ cout<<"B::fun2"<<endl;} }; //end//虚函数示例代码2 int main(){ void (A::*fun)(); //定义一个函数指针 A *p=new B; fun=&A::fun; (p->*fun)(); fun = &A::fun2; (p->*fun)(); delete p; system("pause"); } 你能估算出输出结果吗?如果你估算出的结果是A::fun和A::fun2,呵呵,恭喜恭喜,你中圈套了。其实真正的结果是B::fun和B::fun2,如果你想不通就接着往下看。给个提示,&A::fun和&A::fun2是真正获得了虚函数的地址吗? 首先我们回到第二部分,通过段实作代码,得到一个“通用”的获得虚函数地址的方法 #include<iostream> using namespace std; //将上面“虚函数示例代码2”添加在这里 void CallVirtualFun(void* pThis,int index=0){ void (*funptr)(void*); long lVptrAddr; memcpy(&lVptrAddr,pThis,4); memcpy(&funptr,reinterpret_cast<long*>(lVptrAddr)+index,4); funptr(pThis); //调用 } int main(){ A* p=new B; CallVirtualFun(p); //调用虚函数p->fun() CallVirtualFun(p,1);//调用虚函数p->fun2() system("pause"); } 现在我们拥有一个“通用”的CallVirtualFun方法。 这个通用方法和第三部分开始处的代码有何联系呢?联系很大。由于A::fun()和A::fun2()是虚函数,所以&A::fun和&A::fun2获得的不是函数的地址,而是一段间接获得虚函数地址的一段代码的地址,我们形象地把这段代码看作那段CallVirtualFun。编译器在编译时,会提供类似于CallVirtualFun这样的代码,当你调用虚函数时,其实就是先调用的那段类似CallVirtualFun的代码,通过这段代码,获得虚函数地址后,最后调用虚函数,这样就真正保证了多态性。同时大家都说虚函数的效率低,其原因就是,在调用虚函数之前,还调用了获得虚函数地址的代码
编写判断输入两个数,是否是平方的关系
联想笔试题:
这个选择题为主,有一个编程题考虑到强制类型转换的知识
就是把一个数字存放在一个地址中的题
中雷笔试题
1、 UDP和TCP的区别
1,基于连接与无连接 2,对系统资源的要求(TCP较多,UDP少) 3,UDP程序结构较简单 4,流模式与数据报模式 5,TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证另外结合GPRS网络的情况
2、 查找字串并返回其位置
3、 Linux命令 sed cat mov
4、 举例说明在调试bug是你用过那些调试方式
5、 概率问题 两个筛子,和为奇数的概率?
新模式笔试
他们公司主要是做windows编程的考的考试有内存管理用C++考的不会关于内存分配
其中简答题:对称加密和非对称加密以及常用算法
C++程序进入main函数之前,退出main函数之后会做些什么?
main函数执行之前,主要就是初始化系统相关资源:
1.设置栈指针
2.初始化static静态和global全局变量,即data段的内容
3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容
4.运行全局构造器,估计是C++中构造函数之类的吧
5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数
在调用main函数之前,会先进性初始化栈,堆,打开标准输入,输出,错误流,把参数压栈。还有一些全局变量、对象和静态变量、对象的空间分配和赋初值。
在调用main函数之后,要销毁堆内存,关闭标准输入,输出,错误流。
科达笔试题
感觉这个题虽然不难,但是让我答着很是伤脑子
C++的特性和你对每个特性的理解
0值判断
C语言BOOL值与零值判断的问题
请写出 BOOL flag 与“零值”比较的 if 语句.
if ( flag ) if ( !flag )
①int型变量 n 与“零值”比较的 if 语句就是:
[cpp]
view plaincopy
if ( n == 0 )
[cpp]
view plaincopy
if ( n != 0 )
④请写出 char *p 与“零值”比较的 if 语句。
标准答案:
[cpp]
view plaincopy
if (p == NULL)
if (p != NULL)
Const的用法描述
你毕业设计的描述包括框图
用最优算法实现1-2+3-4.。。。。。
关于linux内核说说你的的了解
1、应用程序通过系统调用和内核通信来运行。应用程序通常调用库函数(c库函数),再由库函数通过系统调用界面让内核代其完成各种不同的任务。
2、内核的架构
系统调用接口、进程管理、内存管理、体系结构相关代码、设备驱动、网络协议栈、虚拟文件系统
3、内核空间与用户空间是程序执行的两种不同的状态、通过系统调用和硬件中断能够完成从用户空间到内核空间的转移
4、linux体系结构由内核空间和用户空间两部分组成,用户空间包含用户程序和c库;
内核空间包含内核、系统调用接口、体系结构相关代码。
5、中断上下文是为了保证中断服务程序能够在第一时间响应和处理中断请求,然后快速退出。
6处理器在任何指定时间点上活动范围在以下三种之一:
运行与内核空间,处于进程上下文,代表某个特定的进程执行。
运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。
运行于用户空间,执行用户进程。
7、单内核和微内核比较(linux内核是运行在单独的内核地址空间)
单内核:把它从整体上作为 单独的大过程来实现,并同时运行在一个单独的地址空间。内核之间通信微不足道,都是运行在内核态,都在同一地址空间,内核可以直接调用函数。
微内核的功能被划分为独立的过程,每个过程叫做一个服务器。所有的服务器都独立并行的运行在各自的地址空间,不能直接调用函数,需要通过消息传递机制处理微内核通信,各个服务器通过进程间通信机制互相传递消息,互换“服务”,这样可以避免一个服务器失效而祸及另一个。
内核源码一半安装在/usr/src/linux目录下
不能在内核中使用浮点数运算。
内核要求能够并发的访问共享数据,这就要求有同步机制来保证不出现竞
编程解析IP 192.168.1.2
中兴力维笔试题
这个考的比较全面
描述你人生生中遇到印象最深的困难如何面对的和收获
C++容器的知识编程
雨花台小公司面试:
问对自己在公司的定位
问毕业后的打算
问在无锡七芯实习后有何收获
聊聊大学生活
冯依曼面试
关于自己的定位
嵌入式软件开发,听从公司安排和对自己的要求,在公司我是个最基础的学习者和零起步的公司员工。
关于自己以后的打算留南京还是回家
毕业后我会在南京找个有上升空间和学习机会的公司不断地努力,让自己技术上有更高的成就。
关于在无锡七芯的收获
1、 公司做事情有规定,和时间限时,做事要和公司节奏一致
2、 公司做事情有些不懂要学会自己研究,不断地查资料,直到解决这个问题,而不是向学校那样,随意拖拖找找老师。
关于物联网的理解和现在应用
关于stm32的休眠模式有几种
关于串口配置的过程
七芯物联面试
上拉电阻的作用
推挽输出?
还有项目的描述以及自己技能
小公司的面试更关主你现在到公司能做什么,他们要的是直接能够做事情的人,回答问题的时候不要想着自己的学习能力和以后的社么,而是要多多表现自己现在能够做什么,能力很强。
江宁一家大公司面试
自我介绍一下,然后问自己擅长什么,比起别人有什么优势
我叫叶稳定,来自金陵科技学院,当初没有认清情况就说自己擅长嵌入式单片机开发,C编程,优势就是能够对嵌入式开发的整体流程有所了解,了解底层所以做软件开发会更有利。但是没有给我笔试的机会(公司招软件开发,先面试后笔试),总结:问题在与我应聘的岗位是软件开发,而我简历和我的表述上都显示出我的底层硬件和单片机等比较好,没有任何软件编程的能力突出,面试官当然就不会看中了。
新模式面试
关于操作系统内存管理文件管理,windows编程的了解,加密解密概念,项目的描述
这家公司主要做的是widnows上面的编程调用windos自带库api进行编程。5个人一起面试的,但是我的表现很一般,没有特别突出的回答,所以就2个去复试了,我没有复试,群体面试的时候不一定要说太多,但是自己熟悉的知识一定要回答好,让面试官有眼前一亮,留下印象,如果你什么都说几句又不全面,只能说嗯记得有这个人,但是么米有特别的,不会录用的。
给自己的建议:
自己的定位:要做软件开发
那就果断改简历,该思想,把自己的能力和技能和项目都表现出有很强的编程能力,有编程的经验。其他的能力对硬件的了解和单片机的熟悉都可以一带而过。
相关文章推荐
- 校招笔试面试中IP地址常见问题总结
- 数据库知识总结---面试笔试
- 面试笔试总结(二)之 C++基础
- 华为面试归来-笔试总结
- 面试笔试题刷题总结 不断更新中。。。。。。
- java面试笔试题总结
- C++笔试面试真题回顾与知识点总结
- Java常见笔试及面试考点总结
- 好耶笔试面试总结
- SJCP试题--JAVA继承时候的构造方法笔试面试总结
- java面试笔试题总结
- 关于前端学习和笔试面试的总结
- 【面试经历】腾讯、网易有道和阿里的笔试分享及自我总结
- 最近笔试面试总结
- 2015校招笔试面试算法总结之蓝汛笔试
- 2017校招数据分析岗笔试、面试知识点大总结
- 笔试面试总结(1)
- 笔试面试网络知识总结
- C++及数据结构笔试面试常见知识点总结
- 广东省电子商务认证有限公司-笔试、面试总结