最近在找工作,遇到了一些面试题,很惭愧的是很多都没答上来。

现在把一些问题总结一下,算是记录一下面试的经历吧。以后有空简单地回答一下,

同时也欢迎各位同仁解答,共同学习一下吧!

  一、嵌入式C语言面试回忆

主观题:
1、在嵌入式系统中,volitate的作用是什么?并给出三个不同的例子。

答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

下面是volatile变量的几个例子:

1). 并行设备的硬件寄存器(如:状态寄存器)

2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3). 多线程应用中被几个任务共享的变量

2、在嵌入式系统中,简述中断函数与一般函数的区别。简述中断与异常的区别。

客观题
(1)大端、小端问题,以共用体示例代码给出

假设计算机的CPU是Intel 32位的,以下代码输出结果是什么?

#include<stdio.h>

union ut
{
short s;
char ch[2];
}u; int main()
{
u.ch[0]=0x11;
u.ch[1]=0x22; printf("u.s=%0x\n",u.s); return 0;
}

答:我的机器上结果是u.s=2211(Intel系列的CPU是小端对齐)

(2)字节对齐问题

下面的结构体占多少个字节?(32位机器上)

struct s

{

    char ch1;

   char ch2;

   short s1;

   char ch3;

}

那么表达式sizeof(s)=?

答:结果是6

(3)char* p="hello world";与char p[]="hello world";的区别。

(4)指针的问题

面试:进程与线程的区别。(面试最后一个问题,居然卡住了,看来得好好看看操作系统了)

二、互联网面试

1、设计模式相关
(1)画出命令模式的类图

(2)使用C++语言实现单例模式类

(3)使用C++语言实现工程模式类

2、数据结构和算法
(1)使用C或者C++实现快速排序

C++代码如下:

#include <iostream> 

#include <cstdlib> // srand() 以及 rand() 

#include <ctime> // time() 

 
using namespace std; int partion(int a[],int p,int r){ //rand srand((unsigned)time( NULL)); int e=rand()%(r-p+1)+p; int tem; tem=a[e]; a[e]=a[r]; a[r]=tem; int x=a[r], i=p-1; for (int j=p;j<r;j++){ if (a[j]<=x){ tem=a[i+1]; a[i+1]=a[j]; a[j]=tem; i++; } } tem=a[r]; a[r]=a[i+1]; a[i+1]=tem; return i+1; } void QuickSort(int a[],int p,int r){ if (p<r){ int q=partion(a,p,r); QuickSort(a,p,q-1); QuickSort(a,q+1,r); } } int main(){ int array[]={0,-2,11,-4,13,-5,14,-43}; QuickSort(array,0,7); for(int i=0;i<=7;i++) cout<<array[i]<<" "; cout<<endl; return 0; }
 

参考资料:

快速排序-百度百科

白话经典算法系列之六 快速排序 快速搞定

快速排序算法

3、C++语言相关
写出了几个类,判断类所占字节数。

含有纯虚函数的类会占用4个字节,空类所占字节数为0

4、不调用C语言库函数,编程实分别实现strcpy、memcpy、memmove。

(1)strcpy

C语言库函数strcpy的原型如下:

char* strcpy(char *strDestination,const char *strSource);

实现代码如下:

//实现从strSource到strDestination的复制
char* strcpy(char* strDestination,const char* strSource)
{
//判断strDestination和strSource的有效性
assert((strDestination == NULL) || (strSource == NULL)); char* strDestCopy = strDestination; //保存目标字符串的首地址
while ((*strDestination++ = *strSource++) != '\0') //把strSource字符串的内容复制到 strDestination中
{
;
} return strDestCopy;
}


(2)memcpy

C语言库函数mempy的原型如下:

void *memcpy( void *dest, const void *src, size_t count );

内存复制函数memcpy实现代码如下:

void *memcpy( void *memDest, const void *memSrc, size_t count )
{
assert((NULL != memDest) && (NULL != memSrc)); //memDest和memSrc必须有效
char* tempDest = (char*)memDest; //保存memDest的首地址
char *tempSrc = (char*)memSrc; //保存memSrc的首地址 while (count-- > 0) //循环count次,复制memSrc的值到memDest中
{
*tempDest++ = *tempSrc++;
} return memDest;
}

(3)memmove

C语言库函数mempy的原型如下:

void *memmove( void *dest, const void *src, size_tcount );

功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:src和dest所指内存区域可以重叠,但复制后src内容会被更改。函数返回指向dest的指针。

内存转移函数memcpy实现代码如下:

void * MyMemMove(void *dst,const void *src,int count)

{

assert(dst);

assert(src);

void * ret = dst;

if (dst <= src || (char *)dst >= ((char *)src + count)) {

while (count--) {

*(char *)dst = *(char *)src;

dst = (char *)dst + 1;

src = (char *)src + 1;

}

}

else {

dst = (char *)dst + count - 1;

src = (char *)src + count - 1;

while (count--) {

*(char *)dst = *(char *)src;

dst = (char *)dst - 1;

src = (char *)src - 1;

}

}

return(ret);

}

参考资料:http://blog.csdn.net/yujun_wu/article/details/4999565

面试题之实现系统函数系列一:实现memmove函数

三、服务器端程序员面试

1、dynamic_cast与static_cast的区别。 (C++知识点) 再加上一个const_cast转换

答:dynamic_cast: 通常在基类和派生类之间转换时使用,run-time cast 只用于指针和引用。

const_cast: 主要针对const和volatile的转换.

static_cast: 一般的转换,no run-time check.  static_cast会检查一下类型,给你一个警告。

reinterpret_cast: 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。

参考文章:http://blog.csdn.net/goodluckyxl/archive/2005/01/19/259851.aspx
http://blog.csdn.net/boluo1982107/article/details/3239793

2、C++中下列数据类型所占的字节数以及数值表示范围。

char     BYTE     WORD    DWORD    unsigned int   short

3、几道数据库题(凭印象回忆吧)

(1)一道选择题,从product表中选出价格最贵的产品名productName以及价格price。

方法一:select TOP 1 productName,price from product ORDER BY DESEND group br productName

方法二:select productName,price from product where price = (select MAX(price) from product

()联合查询和筛选 没做出来,好久没使用SQL了。

4、MFC中CSocket类能不能用在多个线程中,请说明原因。

5、IOCP在服务器中的应用,其特点和优势是什么,主要解决了什么问题。

6、存储过程是什么?在ADO和ODBC中存储过程如何使用?

7、说出进程间通讯的几种方式的名称。

答:

共享内存

管道

信号量

消息队列

信号

套接字

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
http://www.cnblogs.com/mydomain/archive/2010/09/23/1833369.html

8、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”?

答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);

该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。

C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。

9、内存的思考题(来自林锐博士的《C/C++高质量编程》)

(1)void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str); 

strcpy(str, "hello world");

printf(str);

}

请问运行Test函数会有什么样的结果?

答:程序崩溃。

因为GetMemory并不能传递动态内存,

Test函数中的 str一直都是 NULL。

strcpy(str, "hello world");将使程序崩溃。

(2)char *GetMemory(void)



char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory(); 

printf(str);

}

请问运行Test函数会有什么样的结果?

答:可能是乱码。

因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。

(3)void GetMemory2(char **p, int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello"); 

printf(str); 

}

请问运行Test函数会有什么样的结果?

答:

(1)能够输出hello

(2)内存泄漏(没释放掉已经申请的动态内存)

(4)void Test(void)

{

char *str = (char *) malloc(100);

 strcpy(str, “hello”);

 free(str);    

 if(str != NULL)

 {

   strcpy(str, “world”); 

printf(str);

}

}

请问运行Test函数会有什么样的结果?

答:篡改动态内存区的内容,后果难以预料,非常危险。

因为free(str);之后,str成为野指针,

if(str != NULL)语句不起作用。

10、MFC和STL中均有Hash表类模板,请说明其包含的函数(不要求写出实际具体的函数名称),说明其功能即可。

11、下列是线程的伪代码:

FuctionA()

{

   LOCK(x)

   LOCK(y)

   ......

   UNLOCK(x)

   UNLOCK(y)

}

FuctionB()

{

   LOCK(y)

   LOCK(x)

   ......

   UNLOCK(y)

   UNLOCK(x)

}

上述两个线程在执行时会出现线程死锁,请说出解决上述死锁问题的几种解决方案。

14、最后是计算一道UDP的丢包率的题目,

客户端每隔60s发给服务器端1个udp数据包,服务器端在距离上次向服务器端发送应答包超过90s会向客户端再次发送应答包。

客户端一共发送了500个udp包,服务器端发送150个包,假设服务器端和客户端的丢包率相同。

请计算该网络的丢包率。

具体问题记得不大清楚了。

反正最后是没做出来。

四、VC++程序员面试  图像处理

1、QT和C++什么关系,你认为QT和MFC相比有什么异同点,各自的优势什么?

2、谈谈VC++中ADO连接数据库的几种方式?

3、QT采用的编译器是什么?(我问了一个问题是:你们为什么使用VC++做图像处理,而不用QT呢?然后一个技术官反问了我这个问题。)

我直接回答说GCC、CLang、MinGW、VS2008的编译器什么的。没有分条理回答。

QT在Windows平台下一般采用MinGW或VS2008做编译器;

在Linux系统如Ubuntu等发行版下采用GCC作为编译器;

在MAC系统下采用GCC或CLang作为编译器。

然后面试官说错了,QT是采用GCC作为编译器,其他平台需要做移植的,所以我们采用VC++做而不是QT。这点说实话有点没搞懂。

不过做数字图像处理、工控系统仿真、网络游戏,VC++还是比较适合的,这点倒是正常。

这次面试给我的感觉是经验和表达能力都蛮重要的,三个面试官让我有点招架不住。

五、一家建筑/工程/结构类的设计公司,应聘职位为MFC软件开发,笔试题为C++。

1、说明typedef int (*pFun)(int,int *)中pFun的含义,这种类型的用途主要是什么?

pFun被定义为一个指向参数列表为in,int*,返回值为int的函数指针,这种类型即函数指针可以用于定义一种指针类型,指向某种系列类型的函数,通常用于回调函数。

2、以下C++代码段会输出什么?

#include <iostream>
using namespace std; class Base
{
public:
void fun1()
{
cout<<"Base::fun1()"<<endl;
}
virtual void fun2()
{
cout<<"Base::fun2()"<<endl;
}
}; class Derived : public Base
{
public:
void fun1()
{
cout<<"Derived::fun1()"<<endl;
}
void fun2()
{
cout<<"Derived::fun2()"<<endl; }
}; int main(int argc,char *argv[])
{
Base *pBase = new Derived;
pBase->fun1();
pBase->fun2(); return 0;
}

输出结果是什么?

答:Base::fun1()

       Derived::fun2()

分析:主要考察虚函数。

3、最后一道题:判断一个int类型的整型数字是否为回文数。回文数即从左往右,从右往左看,数字结果都一样的数字,例如:232、44、56365等。

使用用C++实现函数bool IsHuiWen(int iNumber);该函数用于判断一个数字是否为回文数。

代码如下:

#include <iostream>
#include <cmath>
using namespace std; /**
* @brief Determine whether an integer is a palindrome.
*
* @param[in] iNumber The number will be judge.
*
* @return true if iNumber is a palindrome, otherwise return false.
*/
bool Ispalindrome(int iNumber)
{
char pStr[10];//由于int占4个字节,最大正数为65535,所以此处10个字符足够了
//1.将整数转换成字符串
//itoa(iNumber, pStr, 10);//Linux下POSIX库整数转换成字符串使用itoa()函数
_itoa_s(iNumber, pStr, 10);//Windows下推荐使用的替代函数:_itoa_s
cout<<"string:"<<pStr<<endl;
int index_start=0;
int index_end = strlen(pStr)-1;
while(index_start <= index_end)
{
if(pStr[index_start] != pStr[index_end])
{
return false;
}
else
{
index_start++;
index_end--;
}
} return true;
} int main(int argc, char *argv[])
{
int n;
cout<<"Please input an integer:";
cin>>n; if(Ispalindrome(n))
{
cout<<n<<" is a palindrome."<<endl;
}
else
{
cout<<n<<" is not a palindrome."<<endl;
} return 0;
}

以上代码在Win7下VC2008控制台程序下测试通过。

六、总结

这段时间好好看看《高质量C++编程-林锐.PDF》这本书,以及数据结构、操作系统、MFC相关的东西。

尤其为了应聘VC++工程师职位,必须好好看看如下这几本书:

1、《MFC Windows应用程序设计》(第2版)

2、《VC++深入详解》孙鑫编著

3、《深入浅出MFC》第二版 侯杰著

4、《网络编程实用教程》 第二版 叶树华编著

 

自己的逻辑能力不太好,基础还有待加强。必须多看书,多做一些编程项目提高自己。

 

C/C++程序员 面试经历总结的更多相关文章

  1. java程序员面试经历(不忘初心,永不放弃,方得始终)。

    其实一直想静下心好好写一点博客,记录下青春,但一直忙于学习,写bug.....转眼间2017只剩下最后几天,岁月无情划过,不留痕迹,唯有稀疏地中海.哈哈,本篇文章主要是想分享下刚毕业入门找工作的一点小 ...

  2. 程序员面试大揭秘——应聘微软、亚马逊、谷歌、苹果等IT公司你都要做什么准备?

    对于多数求职者而言,面试好似一个迷局.你去了,见了几个面试官,答了一堆问题,然后,或两手空空离开,或幸运地拿到录用通知. 你有没有想过: 面试结果是怎么得出的? 面试官会不会互相交流? 公司最看重哪些 ...

  3. Java程序员面试技巧

    Java 程序员面试技巧 对于每一个求职者,有一份优秀的简历是很必要的,企业通过简历的筛选,会给予求职者面试的机会.然而,很多求职者就是在面试过程中与钟情的工作失之交臂.如何在面试中取得成功呢?“细节 ...

  4. ASP.NET的几个试题(《C#与.NET程序员面试宝典》)

    更多参考:博客园笔记 :ASP.NET是什么 ASP.NET不是一种语言,而是创建动态Web页的一种强大的服务器端技术,它是Microsoft.NET Framework中一套用于生成Web应用程序和 ...

  5. 程序员面试京东前端,现场JavaScript代码写出魔方特效

    程序员面试京东前端,现场JS代码写出魔方特效,成功搞定20K月薪 今天小编我逛论坛,看到了一位程序员小伙子,因为是有了两年工作经验,然后去京东面试前端岗,一面二面轻松就过了,到了技术面这一块,小伙干脆 ...

  6. 两年Java程序员面试经验分享,从简历制作到面试总结!

    前言 工作两年左右,实习一年左右,正式工作一年左右,其实挺尴尬的,高不成低不就.因此在面试许多公司,找到了目前最适合自己的公司之后.于是做一个关于面试的总结.希望能够给那些依旧在找工作的同学提供帮助. ...

  7. 《PHP程序员面试笔试宝典》——如何准备电话面试?

    本文摘自<PHP程序员面试笔试宝典>. PHP面试技巧分享,PHP面试题,PHP宝典尽在"琉忆编程库". 用人单位在收到简历之后,有时候由于求职者众多,而且很多求职者的 ...

  8. 《PHP程序员面试笔试宝典》——如何克服面试中紧张的情绪?

    本文摘自<PHP程序员面试笔试宝典>. PHP面试技巧分享,PHP面试题,PHP宝典尽在"琉忆编程库". 面试的成功与否,往小的方面讲,直接关系到求职者的工作问题,往大 ...

  9. 《PHP程序员面试笔试宝典》——如何进行自我介绍?

    本文摘自<PHP程序员面试笔试宝典> PHP面试技巧分享,PHP面试题,PHP宝典尽在"琉忆编程库". 自我介绍是面试中至关重要的一个步骤,很多面试官对求职者提出的第一 ...

随机推荐

  1. 搭建干净的Mac开发学习环境

    docker + linux + gcc/g++ https://www.jianshu.com/p/d113db99fe24 https://www.jianshu.com/p/d26140d20c ...

  2. 一步一步学Vue(九) 路由元数据

    一步一步学Vue(九):https://www.cnblogs.com/Johnzhang/p/7260888.html

  3. Python开发简介

    年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承 . 最新的TIOBE排行榜,Python已经占据世界第四名的位置, Python崇尚优美 ...

  4. 【转】CentOS 7.3 从下载到安装

    CentOS 7.3 从下载到安装  https://blog.csdn.net/sxy2475/article/details/75194142 [百度知道]图解CentOS 7.3安装步骤  ht ...

  5. 【记录】STS设置maven远程仓库,加快下载jar包

    在STS中windows->preferences->maven->user settings 修改user settings里setting.xml配置文件 <?xml ve ...

  6. linux100day(day7)--用户管理和权限管理简单介绍

    系统基础 计算机的三大部件 CPU 内存 IO 总线 一般使用system call和api来调用硬件 一些基础命令, pwd 查看当前路径 cal 计算器 clock 时钟 hwclock 显示与设 ...

  7. Nginx之Keepalived

    目录 Nginx之Keepalived 1. Keepalived 高可用基本概述 1.1 什么是高可用 1.2 高可用通常使用什么软件? 1.3 keepalived是如何实现高可用的? 1.4 那 ...

  8. Linux: 给右键菜单加一个“转换图片为jpg格式”

    Linux上通常都会安装imagemagick这个小巧但又异常强大的工具.这个软件提供了一系列很好用的功能.这里说一说如何使用它的convert命令转换图片为jpg格式,以及如何把它添加到Thunar ...

  9. bootstrap.yml

    spring: jpa: properties: hibernate.enable_lazy_load_no_trans: true application: name: paycore cloud: ...

  10. 转载关于struts命名空间的一则报警

    今天花了点时间把struts2警告事件彻底的测试了一边,终于有点眉目了.希望能给其他人带来一点帮助.文章属于原创.并不需要转载的时候注明出处,而是希望转载的朋友一定要看明白本文内容再转载,因为我你都清 ...