著名企业 c+c++数据结构算法面试笔试题
1 请你分别划划 OSI 的七层网络结构图,和 TCP/IP 的五层结构图?
2 请你详细的解释一下 IP 协议的定义,在哪个层上面,主要有什么作用? TCP 与 UDP 呢?
UDP,TCP 在传输层,IP 在网络层,TCP/IP 是英文 Transmission Control Protocol/Internet
Protocol 的缩写,意思是"传输控制协议/网际协议"。TCP/IP 协议组之所以流行,部分原因
是因为它可以用在各种各样的信道和底层协议(例如 T1 和 X.25、以太网以及 RS-232 串行
接口)之上。确切地说,TCP/IP 协议是一组包括 TCP 协议和 IP 协议,UDP(User Datagram
Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协
议组。TCP/IP 协议并不完全符合 OSI 的七层参考模型。传统的开放式系统互连参考模型,
是一种通信协议的 7 层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使
各种硬件在相同的层次上相互通信。这 7 层是:物理层、数据链路层、网路层、传输层、话
路 层、表示层和应用层。而 TCP/IP 通讯协议采用了 4 层的层级结构,每一层都呼叫它的下
一层所提供的网络来完成自己的需求。这 4 层分别为:
应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络
远程访问协议(Telnet)等。
传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报
协议(UDP)等,TCP 和 UDP 给数据包加入传输数据并把它传输到下一层中,这一层负责传
送数据,并且确定数据已被送达并接收。
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但
不检查是否被正确接收),如网际协议(IP)。
网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如 Ethernet、Serial Line
等)来传送数据。
Q3:请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?
一 般意义上说交换机是工作在数据链路层。但随着科技的发展,现在有了三层交换机,三
层交换机已经扩展到了网络层。也就是说:它等于“数据链路层 + 部分网络层”。交换机
中传的是帧。通过存储转发来实现的。路由器是工作在网络层。路由器中传的是 IP 数据报。
主要是选址和路由。
Q4:请问 C++的类和 C 里面的 struct 有什么区别?
结构是一种将数据集合成组的方法,类是一种同时将函数和数据都集合成组的方法。结构和
类在表面上的唯一区别是:类中的成员在默认情况下是私有的,而结构中的成员在默认情况
下是公用的。
class
{
private:
public:
foo
int
data1;
void
func();
};
可以写成:
class
{
foo
int
data1;
public:
void
func();
};
因为在类中默认的是私有的,所以关键字 private 就可以不写了。
如果想用结构完成这个类所作的相同的事,就可以免去关键字 public,并将公有成员放
置在私有成员之前:
struct
{
foo
void
func();
int
data1;
private:
};
Q5:请讲一讲析构函数和虚函数的用法和作用?
在 JAVA 里没有象 C++中的,所谓的析构函数 ,因为当一个对象不在使用的时候,它会自动被
垃圾回收器回收,所以也就用不着析构函数了, 那个 finalize 也只有在被垃圾回收器回收,
才会被执行,而且很多时候,垃圾回收器并不一定执行,所以它不能当做 C++中的,所谓的析
构函数使用, 虚函数在 JAVA 里也是没有的,比较象近的应该算是 abstract。
Q6:全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
1)、全局变量的作用用这个程序块,而局部变量作用于当前函数
2)、前者在内存中分配在全局数据区,后者分配在栈区
3)、生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部
函数内部,甚至局部循环体等内部存在,退出就不存在
4)、使用方式不同:通过声明后全局变量程序的各个部分都可以用到,局部变量只能在局部
使用
Q7:一些寄存器的题目,主要是寻址和内存管理等一些知识。
Q8:8086 是多少位的系统?在数据总线上是怎么实现的?
8086 微处理器初次发布时,这块 16 位芯片仅包含 29000 个晶体管,运行速度为 5MHz。
而当今基于x86 架构的奔腾 4 处理器,已经包含 5500 万个晶体管,运行速度提高了 600 倍
以上,高达 3.06GHz。
8086 是高性能的第三代微处理器,是 Intel 系列的 16 位微处理器,它是采用 HMOS 工艺制
造的,内部包含约 29,000 个晶体管。
8086 有 16 根数据线和 20 根地址线,因为可用 20 位地址,所以可寻址的地址空间达 220
即 1M 字节。8086 工作时,只要一个 5V 电源和一相时钟,时钟频率为 5MHz。后来,Intel
公司推出的 8086-1 型微处理器时钟频率高达 10MHz,8086-2 型微处理器时钟频率达 8MHz。
1、局部变量能否和全局变量重名
答:能,局部会屏蔽全局。要用全局变量,需要使用"::"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而
不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,
比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体
内。
2、如何引用一个已经定义过的全局变量
答:extern
可以用引用头文件的方式,也可以用 extern 关键字,如果用引用头文件方式来引用某
个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用
extern 方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报
错。
3、全局变量可不可以定义在可被多个.C 文件包含的头文件中 为什么
答:可以,在不同的 C 文件中以 static 形式来声明同名全局变量。
可以在不同的 C 文件中声明同名的全局变量,前提是其中只能有一个 C 文件中对此变量
赋初值,此时连接不会出错
4、语句 for( ;1 ;)有什么问题 它是什么意思
答:和 while(1)相同。
5、do……while 和 while……do 有什么区别
答:前一个循环一遍再判断,后一个判断以后再循环
6、请写出下列代码的输出内容
以下是引用片段:
#include
main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c,d:%d,%d,%d",b,c,d);
return 0;
}
答:10,12,120
7、static 全局变量与普通的全局变量有什么区别 static 局部变量和普通局部变量有
什么区别 static 函数与普通函数有什么区别
全局变量(外部变量)的说明之前再冠以 static 就构成了静态的全局变量。全局变量本
身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不
同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源
文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其
作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可
以避免在其它源文件中引起错误。
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了
它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
static 函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该
说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件
以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static 全局变量与普通的全局变量有什么区别:static 全局变量只初使化一次,防止
在其他文件单元中被引用;
static 局部变量和普通局部变量有什么区别:static 局部变量只被初始化一次,下一
次依据上一次结果值;
static 函数与普通函数有什么区别:static 函数在内存中只有一份,普通函数在每个
被调用中维持一份拷贝
8、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在
于( 堆)中。
9、设有以下说明和定义:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:___52____
答:DATE 是一个 union, 变量公用空间. 里面最大的变量类型是 int[5], 占用 20 个字
节. 所以它的大小是 20
data 是一个 struct, 每个变量分开占用空间. 依次为 int4 + DATE20 + double8 = 32.
所以结果是 20 + 32 = 52.
当然...在某些 16 位编辑器下, int 可能是 2 字节,那么结果是 int2 + DATE10 + double8
= 20
10、队列和栈有什么区别
队列先进先出,栈后进先出
11、写出下列代码的输出内容
以下是引用片段:
#include
int inc(int a)
{
return(++a);
}
int multi(int*a,int*b,int*c)
{
return(*c=*a**b);
}
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int*,int*,int*);
void show(FUNC2 fun,int arg1, int*arg2)
{
INCp=&inc;
int temp =p(arg1);
fun(&temp,&arg1, arg2);
printf("%d\n",*arg2);
}
main()
{
int a;
show(multi,10,&a);
return 0;
}
答:110
12、请找出下面代码中的所有错误
说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
以下是引用片段:
1、#include"string.h"
2、main()
3、{
4、 char*src="hello,world";
5、 char* dest=NULL;
6、 int len=strlen(src);
7、 dest=(char*)malloc(len);
8、 char* d=dest;
9、 char* s=src[len];
10、 while(len--!=0)
11、 d++=s--;
12、 printf("%s",dest);
13、 return 0;
14、}
答:
方法 1:
以下是引用片段:
int main()
{
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要为\0 分配一个空间
char* d = dest;
char* s = &src[len-1];//指向最后一个字符
while( len-- != 0 )
*d++=*s--;
*d = 0;//尾部要加\0
printf("%s\n",dest);
free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
return 0;
}
方法 2:
以下是引用片段:
#include
#include
main()
{
char str[]="hello,world";
int len=strlen(str);
char t;
for(int i=0; i
{
t=str[i];
str[i]=str[len-i-1]; str[len-i-1]=t;
}
printf("%s",str);
return 0;
}
1.-1,2,7,28,,126 请问 28 和 126 中间那个数是什么 为什么
第一题的答案应该是 4^3-1=63
规律是 n^3-1(当 n 为偶数 0,2,4)n^3+1(当 n 为奇数 1,3,5)
答案:63
2.用两个栈实现一个队列的功能 要求给出算法和思路!
设 2 个栈为 A,B, 一开始均为空.
入队:
将新元素 push 入栈 A;
出队:
(1)判断栈 B 是否为空;
(2)如果不为空,则将栈 A 中所有元素依次 pop 出并 push 到栈 B;
(3)将栈 B 的栈顶元素 pop 出;
这样实现的队列入队和出队的平摊复杂度都还是 O(1), 比上面的几种方法要好。3.在 c
语言库函数中将一个字符转换成整型的函数是 atool()吗,这个函数的原型是什么
函数名: atol
功 能: 把字符串转换成长整型数
用 法: long atol(const char *nptr);
程序例:
以下是引用片段:
#include
#include
int main(void)
{
long l;
char *str = "98765432";
l = atol(lstr);
printf("string = %s integer = %ld\n", str, l);
return(0);
}
13.对于一个频繁使用的短小函数,在 C 语言中应用什么实现,在 C++中应用什么实现
c 用宏定义,c++用 inline
14.直接链接两个信令点的一组链路称作什么
PPP 点到点连接
15.接入网用的是什么接口
16.voip 都用了那些协议
17.软件测试都有那些种类
黑盒:针对系统功能的测试
白合:测试函数功能,各函数接口
18.确定模块的功能和模块的接口是在软件设计的那个队段完成的
概要设计阶段
19.
enum string
{x1,x2,x3=10,x4,x5,}x;
问 x= 0x801005,0x8010f4 ;
20.
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问 p1+5= ;
p2+5= ;
选择题:
21.Ethternet 链接到 Internet 用到以下那个协议
A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
22.属于网络层协议的是:
A.TCP;B.IP;C.ICMP;D.X.25
23.Windows 消息调度机制是:
A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;
24.
unsigned short hash(unsigned short key)
{
return (key>>)%256
}
请问 hash(16),hash(256)的值分别是:
A.1.16;B.8.32;C.4.16;D.1.32
找错题:
25.请问下面程序有什么错误
int a[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;
把循环语句内外换一下
26.
以下是引用片段:
#define Max_CB 500
void LmiQueryCSmd(Struct MSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum
{
......;
}
死循环
27.以下是求一个数的平方的程序,请找出错误:
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
28.
以下是引用片段:
typedef unsigned char BYTE
int examply_fun(BYTE gt_len; BYTE *gt_code)
{
BYTE *gt_buf;
gt_buf=(BYTE *)MALLOC(Max_GT_Length);
......
if(gt_len>Max_GT_Length)
{
return GT_Length_ERROR;
}
.......
}
问答题:
29.IP Phone 的原理是什么
IPV6
30.TCP/IP 通信建立的过程怎样,端口有什么作用
三次握手,确定是哪个应用程序使用该协议
31.1 号信令和 7 号信令有什么区别,我国某前广泛使用的是那一种
32.列举 5 种以上的电话新业务
1.static 有什么用途?(请至少说明两种)
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访
问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,
这个函数被限制在声明它的模块的本地范围内使用
2.引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
3.描述实时系统的基本特性