C/C++面试笔试题
答题要求:
1)所有答案写在空白答题纸上,考试过程不得使用手机等通信工具!
2)试卷需回收复用(低碳环保),不得涂写,否则考试结果总分扣10分;
一基础简答题(30分,每道题目2分)
1  简要描述C++指针和引用区别
指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已
(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
2  简要描述中断和异常的区别
3  操作系统的堆(Heap)和栈(Stack)的区别?(非数据结构里面的堆和栈)
∙栈(操作系统):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放∙堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆则是存放在二级缓存中,
4 进程和线程有什么区别
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文
5 在32位系统的机器上,下面数据类型的指针变量占多少位?
char  *pszChar=NULL;
int  *pInt=NULL;
6 列举几种进程/线程间通信的方法
线程间通信和同步的方式主要有锁、信号、信号量
7 已知一个数组ARRAY,定义一个宏(NA),求出数组的元素个数
8 简要描述C++ new 操作符与C语言的malloc区别
9 下列代码:
int GetValue()
{
static char *tmp0="12131";
int  m=1;
return nValue;
}
请问“12131”是分配在堆上还是分在栈上?
10  在32位系统下,定义变量 char *a[5][6], 则变量a内存空间大小为字节
11  简要描述TCP/IP的协议架构层次,并简单描述每一层次的主要功能
12  简单描述路由器和普通以太网交换机的区别以及各自工作在那一层协议
13  简要描述自己使用过的几个C++ STL常用组件
14  什么叫函数可重入?
15  简要描述进程(线程)同步、异步的区别
二代码排错题(共16分,每道题目4分)
1 分析下面程序在32位Windows或32位Linux系统下下编译执行,会出现什么情况?#include<stdio.h>
int  main(int argc, char * argv[])
{
char buffer[100*1024*1024];
printf("hello world\n");
return 0;
}
2分析add 函数有什么问题?
int  add(int n,int m)//实现两个数相加
{
static  int temp=0;
temp+=m;
temp+=n;
return temp;
}
3下面代码编译,执行后会有什么问题?
#include <stdio.h>
#include<string.h>
int main(int argc, char* argv[])
{
char *s1="abcdefg";
char *s2="bcde";
memcpy(s1,s2,sizeof(4));
printf("%s",s1);
return 0;
}
4 分析下面的代码运行会有什么问题
#include <stdio.h>
#include<string.h>
int main(int argc, char* argv[])
{
int buffer[20];
int *pbuffer = buffer;
for(int i = 0; i < sizeof(buffer); i++)
{
*(pbuffer++) = 0;
}
return 0;
}
三综合分析题(22分)
1 分析下列程序输出结果(4分)
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
char a[100];
char *p,*p1=a;
printf("%d,%d,%d,%d",sizeof(a),sizeof(p1),sizeof(*p1),sizeof(&p1[0]));  return 0;
}
2 分析下列程序输出结果--静态、析构、传值调用(6分)
#include "stdafx.h"
class CObj
{
public:
CObj(){
m_nCounter++;
};
~CObj()
{
m_nCounter--;
};
static void Print()
{
printf("Counter=%d\n",m_nCounter);
};
private:
static int m_nCounter;
};
int CObj::m_nCounter=0;
void  Test(CObj a,CObj b)
{
CObj::Print();
};
int _tmain(int argc, _TCHAR* argv[])
{
CObj a,b,c;
CObj::Print();
{
CObj c,d,e;
CObj::Print();
}
CObj::Print();
Test(a,b);
CObj::Print();
return 0;
}
3 写出以下代码执行结果--虚函数和成员函数调用(12分)#include "stdafx.h"
class CBase
{
public:
CBase()
{
面试综合分析100题m=0;
n=0;
}
virtual void Test()
{
m=0;
n=0;
printf("Test:m=%d,n=%d\n",m,n);
};
void Test1()
{
printf("Test1:m=%d,n=%d\n",m,n);
}
protected:
int m;
int n;
};
class CDerive:public CBase
{
public:
CDerive()
{
m++;
n++;
};
virtual void Test()
{
printf("Test:m=%d,n=%d\n",m,n);
}
void Test1()
{
printf("Test1:m=%d,n=%d\n",m,n);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CBase base;
CDerive Derive;
CBase *pBaseArray[2]={&base,&Derive};
pBaseArray[0]->Test();
pBaseArray[1]->Test();
pBaseArray[0]->Test1();
pBaseArray[1]->Test1();
return 0;
}
四编程题目(32分)
1  不调用库函数,写一个函数,输入一个整数,返回这个整数对应的字符串;比如输入245,返回“245”。(10分)
函数原型:
int  GetCount(int nValue,char *buffer,int nBufferLen); // buffer:保存字符串缓冲,假定预先分配长度为32;
2 有人想将手中一张面值100元的人民币换成5元、1元、0.5元面值的零钱共100张,以上三种面值的零钱至少有一张,问共有几种换法。请编写一个函数实现输出每一种换法的钞票数量。(10分)
函数原型:  void  OutputMethod();
3一辆卡车违反交通规则,撞人逃跑。现场3人目击,但没记住车号,只记下车的特征。甲说:牌照前两位数相同,乙说:牌照后两位数相同。丙是位数学家,他说:四位的车号刚好是一个整数的平方。请编写一个函数,输出车牌号。(12分)函数原型: int  OutputCarNo()