通信笔试宝典(第二版)通信笔试宝典马守贵版本记录版本号时间完成人V12007-10胥进V2a2008-10马守贵-1-通信笔试宝典(第二版)前言本文是作者及周围同学在找工作过程中总结的一些笔试面试常考的基础知识,主要针对IT相关专业尤其是电子通信类偏软类毕业生。适合于欲在短时间内准备工作面试笔试的同学。本文主要内容有以下几个部分:①C/C++语言。C/C++语言是IT行业公司必考知识。本文没有拘泥于其基本语法,只是列出笔试面试中易考的基本概念,并对需要深入理解的部分做了详细说明。主要涉及引用与指针、类与对象、继承等。②数据结构部分。数据结构是另外一个很重要的基础知识部分。主要介绍了链表、队列等数据结构的基本操作,以及排序算法等常考知识点。昀后,简要介绍了字符串相关操作。③嵌入式程序设计部分。关注了嵌入式程序设计职位需要考察的几个基本知识点。④操作系统部分。主要介绍了操作系统相关的主要知识点,如进程线程、并发进程、处理器调度、内存管理和设备管理等。⑤计算机网络部分。计算机网络也是笔试面试中的常考内容。本文主要针对一些重要部分和容易混淆的概念做了详细介绍。⑥通信原理部分。本文昀后特地针对应聘通信企业添加了通信相关知识。通信原理部分主要介绍通信专业本科生的基本知识,主要包括模拟和数字调制技术、信源和信道编码技术、基带和频带传输技术等。⑦移动通信原理部分。该部分针对通信专业中无线通信方向的职位特意准备。主要介绍了移动通信的基本结构和基本原理。主要包括无线信道特点、移动通信体制、OFDM和MIMO技术等。由于时间仓促和水平所限,难免存在遗漏和错误,文章排版也没有完成,欢迎各位读者指正。可以通过电子邮件与作者联系:mashougui@gmail.com。作者保留版权,引用请注明出处。马守贵2008-10-19于移动通信国家重点实验室-2-通信笔试宝典(第二版)1C/C++部分1.1C语言1int(*(*f)(int,int))(int)这里的f是什么?答案:f是指针,指向一个参数为(int,int),返回值为一个指针的函数这个返回的指针指向一个参数为(int),返回值为int的函数〕。2描述内存分配方式以及它们的区别?从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。在栈上创建:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束后,这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。从堆上分配:亦即动态内存分配。程序在运行的时候用户malloc或者new申请任意多的内存,程序员自己负责在何时使用free或者delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也昀多。1.2高质量的C/C++代码浮点型数据与与零值的比较:if(a==0.0)//隐含错误;循环语句的效率(1)(2)(3)(4)(5)(6)(1)(2)(3)(4)(5)在多重循环中,如果有可能,应当将昀长的循环放在昀内层,昀短的循环放在昀外层,以减少CPU跨切循环层的次数。当循环中存在判断时,如果循环次数很大,可以将判断移到循环外面来,以提高循环执行的效率。函数的设计:函数的参数表要完整;传递指针参数,且其值仅作输入,可将其声明为const*参数,以防止函数内对该指针意外的修改;输入参数采用值传递时,可以考虑使用const&,这样可以省去临时对象的构造和析构过程,提高效率。输入参数不易太多,5个以内。1.3Static、extern、inline、const等关键词详解1.3.1Static作用:控制变量的存储方式和可见性;Static变量存储在静态存储区,而非栈上;内部连接,与“extern”相对;类中的static成员(包括数据成员和成员函数),是类的成员而非某一特定对象的成员,属于整个类,没有this指针;隐藏在类的内部,对外不可见;注意静态成员的初始化、削除的顺序;静态成员函数不能直接引用非静态数据成员,必须指定特定的对象;-3-通信笔试宝典(第二版)控制变量的存储方式和可见性。1.3.2Const出现的背景及用法:(1)(2)(3)(4)(1)(2)(3)为了取代预编译指令(#define),同时可以实现在预编译的时候引入类型检测机制。C++编译器不为const常量分配空间,而是保存在符号表中,整个编译期间的常量;左结合修饰符:intconst*a;//指针a可变,指针指向的变量*a不可变;int*consta;//指针a不可变,指针指向的变量*a可变;限定函数的传递参数,昀好在函数内部进行限定;例如,voidfun(constintvar),可以定义成如下的形式:Voidfun(intvar){Constint&varalias=var;Varalias…………}待续……不能把非const指针指向const变量同#define的区别:Const和#define均可以定义常量,但是从const有以下优点:Const常量有数据类型,而宏常量没有数据类型。编译器对前者进行类型安全检查,而对后者只进行字符替换。有些集成化测试工具可以对const常量进行调试,但是不能归宏常量进行调试。因此在C++中,const完全代替宏常量。1.3.3Inline定义的内联函数C++中用来替代C中表达式形式的宏定义。存放在符号表中,调用是可以直接展开,象宏定义一样,效率大大提高;与宏定于不同,编译器并不只是简单的替换,而是象一个函数一样进行参数类型检测等一系列的相关检测。消除了宏定义的副作用。注意:内联函数在调用之前必须进行定义,否则编译器无法知道插入什么代码。所以内联函数通常写在主函数的前面。z内联函数和宏的区别是什么?内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断,在编译的时候内联函数可以直接嵌入到代码中去。而宏只是一个简单的替换。内联函数要作参数类型检查,这是内联函数和宏相比的优势。Incline是指嵌入代码,就是在调用函数的地方,在编译的时候,直接将代码写到那里去。对于短小的代码来说,可以带来效率的提升,而且和宏相比,更加安全可靠。然而这是以增加空间消耗为代价的。宏不是函数,只是在编译预处理阶段将程序中有关字符替换成宏体。Incline是函数,但是在编译中不单独产生代码,而是将有关代码嵌入到调用处。-4-通信笔试宝典(第二版)1.4C++中的特性C++中不但全面兼容C的特性,还增加了一些面向对象的新特性。1.4.1注释行//1.4.2C和C++的区别1、在C中main()前可以没有void,而在C++中必须添加函数类型;2、在C中变量声明要在所有语句之前;C++放松了这个限制,但必须在使用之前声明变量;3、在C声明变量时进行初始化,只能用常量,而C++中放松了这种限制,声明变量时可以使用有效的表达式来初始化;4、在C++中使用cin,cout分别代替printf和scanf;但是在C中则没有这两个对象;5、scanf与printf一样也可以使用格式化自负,但他们也有不同,首先,scanf的所有变量都是内存地址,除非是一个指针,否则必须在变量前加入一个&;其次,scanf对类型要求更为严格,long类型必须使用%ld,double必须使用%lf等等;6、函数原型声明时后面要添加分号,而在函数定义时就不需要加分号了;7、C++的main()函数与其他函数一样,但也有两点不同:一是它是函数的入口;二是它不需要函数原型;8、静态变量综合了局部变量的作用域和全局变量扩展的的生存周期,在两次调用之间数值保持不变;即,在一个函数被调用多次时,静态变量只被初始化一次;静态函数(限制了作用域),只在被声明的程序模块中可见,一般的函数在工程所有模块都是可见的;而对于变量,除非被声明为外部的,否则它仅在被声明的程序模块中是可见的,声明外部变量首先要将其声明为全局变量,在要是使用此变量的程序模块中加上extern声明;9、位段,用一个简洁的结构,例如:unsigned10、C++允许&对引用的参数进行声明(和指针作用一样,可以修改原始数据;而不是像参数传递一样,修改数据副本),C没有这个特点;例如:函数声明voidfunc_1(int*argument);而在函数调用时:intargment1;func_1(&argument1);&的使用建立了堆栈,引用后,自动释放堆栈11、C,C++做动态内存分配时malloc和free都支持;但new和delete是C++特有的,并且new和delete可以自动的调用构造函数和析构函数;他们要成对使用,不要交叉使用。♦(Malloc与普通变量一点不同,malloc内的元素不可以直接访问,只能应用指针来操作;)♦对象指针:C++支持new和delete关键字来动态的创建对象,例如:CStr*pString;pString=newCStr;//……deletepString;♦new和delete的使用方法:pointer=newtype[num_elements];(new的长度要加1,终止符的位置也要占一位)delete[]pointer;-5-通信笔试宝典(第二版)1.4.3新的I/O流cin;cout;包含头文件iostream.h换行endl;1.4.4函数原型C++中规定必须为每一个函数建立原型(C语言中只是建议)。其主要目的是让C++编译器进行检查以确定调用函数的参数与事先声明的原型是否相符。说明:函数原型的参数表中可以只有类型而不给出他们的参数;(1)(2)(3)(4)(5)函数定义时必须给出完整的参数表,包括参数类型和参数名。而且不同与C语言,C++中不允许函数的参数说明放在函数说明部分和函数体之间;主函数main()不必进行原型说明,因为他只会被操作系统调用而不会被其他函数调用;C++中默认的函数(包括main函数)返回值为int型;如果一个函数没有返回值,在其原型中必须注明void。1.4.5函数重载C++中两个或两个以上的函数可以共用同一个函数名,这就是函数的重载。重载函数之间在参数个数或参数类型上要所区别,或者两者兼而有之。只有返回值类型不同的函数之间无法重载。一般而言,重载的函数应该执行相同的操作。1.4.6作用域运算符“::”局部变量在其作用域内有较高的优先级,如果在局部变量的作用域内希望访问同名的全局变量,需要使用作用域运算符“::”,如::var。1.4.7无名联合Union后面不给出联合名,使一组数据共享同一内存地址。访问时直接访问其中的数据名。1.4.8C++中的强制类型转换C++中的强制类型转换兼容C中的类型转换。增加了如下的转换形式;Inti;Floatx=float(i);即将函数类型名作为函数名使用,使得类型转换的执行好像调用了一个函数一样,更为方便和易于理解。1.4.9New和deleteNew和delete可以动态分配和释放内存空间,类似于C中的malloc和free,但比后者更方便,更安全。New的使用形式为:p=newtype;其中type为类型名(可以是类名),p为指向该数据类型的指针。New从一个称为堆的自由存储区中分配一块sizeof(type)字节大小的内存空间,并把该内存空间的首地址赋给指针p。Delete用来释放new分配的内存空间,形式为:-6-通信笔试宝典(第二版)Deletep;其中p为指针,保持着new分配内存的首地址。优点:自动分配内存的大小,无需使用sizeof计算;(1)(2)(3)(4)(1)(2)(3)(4)(5)(6)(1)(2)(3)(4)自动返回真确的指针类型;能够在new的时候初始化;可以重载new和delete;注意:New与delete需要配对使用;可以为数组分配内存空间,如:p=newint[10];New可以为简单变量初始化,如:p=newint(10);New无法为动态分配的数组进行初始化;释放动态分配的数组存储区时,delete的格式如:delete[]p;内存分配失败时,new返回的指针