C语言终极面试宝典 C语言面试必备12123.docx

上传人:you****now 文档编号:68766371 上传时间:2022-12-29 格式:DOCX 页数:84 大小:154.84KB
返回 下载 相关 举报
C语言终极面试宝典 C语言面试必备12123.docx_第1页
第1页 / 共84页
C语言终极面试宝典 C语言面试必备12123.docx_第2页
第2页 / 共84页
点击查看更多>>
资源描述

《C语言终极面试宝典 C语言面试必备12123.docx》由会员分享,可在线阅读,更多相关《C语言终极面试宝典 C语言面试必备12123.docx(84页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第一部分:基本概念及其它问答题1、关键字字stattic的作作用是什么么?这个简单的的问题很少少有人能回回答完全。在在C语言中,关关键字sttaticc有三个明明显的作用用:1). 在在函数体,一一个被声明明为静态的的变量在这这一函数被被调用过程程中维持其其值不变。2). 在在模块内(但但在函数体体外),一一个被声明明为静态的的变量可以以被模块内内所用函数数访问,但但不能被模模块外其它它函数访问问。它是一一个本地的的全局变量量。3). 在在模块内,一一个被声明明为静态的的函数只可可被这一模模块内的其其它函数调调用。那就就是,这个个函数被限限制在声明明它的模块块的本地范范围内使用用。大多数应试试

2、者能正确确回答第一一部分,一一部分能正正确回答第第二部分,同同是很少的的人能懂得得第三部分分。这是一一个应试者者的严重的的缺点,因因为他显然然不懂得本本地化数据和代码范范围的好处处和重要性性。2、“引用用”与指针的的区别是什什么?答、1) 引用必须须被初始化化,指针不不必。2) 引用用初始化以以后不能被被改变,指指针可以改改变所指的的对象。3) 不存存在指向空空值的引用用,但是存存在指向空空值的指针针。指针通过某某个指针变变量指向一一个对象后后,对它所所指向的变变量间接操操作。程序序中使用指指针,程序序的可读性性差;而引引用本身就就是目标变变量的别名名,对引用用的操作就就是对目标标变量的操操作

3、。流操作符、赋值值操作符=的返回值值、拷贝构构造函数的的参数、赋赋值操作符符=的参数、其其它情况都都推荐使用用引用3、.h头头文件中的的ifnddef/ddefinne/enndif 的作用?答:防止该该头文件被被重复引用用。4、#inncludde 与#inccludee fiile.hh的区别别?答:前者是是从Staandarrd Liibrarry的路径径寻找和引引用fille.h,而而后者是从从当前工作作路径搜寻寻并引用ffile.h。5、描述实实时系统的的基本特性性答:在特定定时间内完完成特定的的任务,实实时性与可可靠性。6、全局变变量和局部部变量在内内存中是否否有区别?如果有,是是

4、什么区别别?答:全局变变量储存在在静态数据据区,局部部变量在堆堆栈中。7、什么是是平衡二叉叉树?答:左右子子树都是平平衡二叉树树且左右子子树的深度度差值的绝绝对值不大大于1。8、堆栈溢溢出一般是是由什么原原因导致的的?答:1.没没有回收垃垃圾资源 2.层层次太深的的递归调用用9、冒泡排排序算法的的时间复杂杂度是什么么?答:O(nn2)10、什么么函数不能能声明为虚虚函数?答:connstruuctorr11、队列列和栈有什什么区别?答:队列先先进先出,栈栈后进先出出12、不能能做swiitch()的参数数类型答:swiitch的的参数不能能为实型。13、局部部变量能否否和全局变变量重名?答:能

5、,局局部会屏蔽蔽全局。要要用全局变变量,需要要使用:局部变量可可以与全局局变量同名名,在函数数内引用这这个变量时时,会用到到同名的局局部变量,而而不会用到到全局变量量。对于有有些编译器器而言,在在同一个函函数内可以以定义多个个同名的局局部变量,比比如在两个个循环体内内都定义一一个同名的的局部变量量,而那个个局部变量量的作用域域就在那个个循环体内内14、如何何引用一个个已经定义义过的全局局变量?答、可以用用引用头文文件的方式式,也可以以用exttern关关键字,如如果用引用用头文件方方式来引用用某个在头头文件中声声明的全局局变量,假假定你将那那个变量写写错了,那那么在编译译期间会报报错,如果果你

6、用exxternn方式引用用时,假定定你犯了同同样的错误误,那么在在编译期间间不会报错错,而在连连接期间报报错。15、全局局变量可不不可以定义义在可被多多个.C文件包包含的头文文件中?为为什么?答、可以,在在不同的CC文件中以以stattic形式式来声明同同名全局变变量。可以在不同同的C文件中声声明同名的的全局变量量,前提是是其中只能能有一个CC文件中对对此变量赋赋初值,此此时连接不不会出错。16、语句句for( ;1 ;)有什么问问题?它是是什么意思思?答、和whhile(1)相同同,无限循循环。17、doowhhile和和whilleddo有什么么区别?答、前一个个循环一遍遍再判断,后后一

7、个判断断以后再循循环。18、sttatacc 全局变变量、局部部变量、函函数与普通通全局变量量、局部变变量、函数数statiic全局变变量与普通通的全局变变量有什么么区别?sstatiic局部变变量和普通通局部变量量有什么区区别?sttaticc函数与普普通函数有有什么区别别?答、全局变变量(外部变量量)的说明之之前再冠以以stattic 就就构成了静静态的全局局变量。全全局变量本本身就是静静态存储方方式,静态态全局变量量当然也是是静态存储储方式。这这两者在存存储方式上上并无不同同。这两者者的区别虽虽在于非静静态全局变变量的作用用域是整个个源程序,当一个源程序由多个源文件组成时,非静态的全局变

8、量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析析可以看出出,把局部部变量改变变为静态变变量后是改改变了它的的存储方式式即改变了了它的生存存期。把全全局变量改改变为静态态变量后是是改变了它它的作用域域,限制了了它的使用用范围。statiic函数与与普通函数数作用域不不同。仅在在本文件。只只在当前源源文件中使使用的函数数应该说明明为内部函函数(sttaticc),内部部函数应该该在当前源源文件中说说

9、明和定义义。对于可可在当前源源文件以外外使用的函函数,应该该在一个头头文件中说说明,要使使用这些函函数的源文文件要包含含这个头文文件statiic全局变变量与普通通的全局变变量有什么么区别:sstatiic全局变变量只初使使化一次,防防止在其他他文件单元元中被引用用;statiic局部变变量和普通通局部变量量有什么区区别:sttaticc局部变量量只被初始始化一次,下下一次依据据上一次结结果值;statiic函数与与普通函数数有什么区区别:sttaticc函数在内内存中只有有一份,普普通函数在在每个被调调用中维持持一份拷贝贝19、程序序的内存分分配答:一一个由c/C+编编译的程序序占用的内内存

10、分为以以下几个部部分1、栈区(sstackk)由编译器器自动分配配释放,存存放函数的的参数值,局局部变量的的值等。其其操作方式式类似于数数据结构中中的栈。22、堆区(hheap)一般由程程序员分配配释放,若若程序员不不释放,程程序结束时时可能由OOS回收。注注意它与数数据结构中中的堆是两两回事,分分配方式倒倒是类似于于链表,呵呵呵。3、全局区区(静态区区)(sttaticc)全局变量量和静态变变量的存储储是放在一一块的,初初始化的全全局变量和和静态变量量在一块区区域,未初初始化的全全局变量和和未初始化化的静态变变量在相邻邻的另一块块区域。程程序结束后后由系统释释放。4、文字常常量区常量字符符串

11、就是放放在这里的的。程序结结束后由系系统释放。5、程序代码区存放函数体的二进制代码例子程序这这是一个前前辈写的,非非常详细/maiin.cppp iint aa=0; /全局初初始化区 chaar *pp1; /全全局未初始始化区 mainn() intbb;栈 chaar s=aabc; /栈 chaar *pp2; /栈 chaar *pp3=11234556; /123445600在常量区区,p3在在栈上。 sttaticc intt c=00; /全局局(静态)初初始化区 p11 = (charr*)maallocc(10); p2 = (chhar*)mallloc(220); /分

12、配得来来得10和和20字节节的区域就就在堆区。 strcpy(p1,123456); /1234560放在常量区,编译器可能会将它与p3所向123456优化成一个地方。20、解释释堆和栈的的区别答:堆(hheap)和和栈(sttack)的区别(1)申请请方式sttack:由系统自自动分配。例例如,声明明在函数中中一个局部部变量innt b;系统自动动在栈中为为b开辟空空间heaap:需要要程序员自自己申请,并并指明大小小,在c中中mallloc函数数如p1=(chaar*)mmallooc(100);在CC+中用用new运运算符如pp2=(cchar*)mallloc(10);但是注意意p1、

13、pp2本身是是在栈中的的。(2)申请请后系统的的响应栈:只要栈的的剩余空间间大于所申申请空间,系系统将为程程序提供内内存,否则则将报异常常提示栈溢溢出。堆:首先应该该知道操作作系统有一一个记录空空闲内存地地址的链表表,当系统统收到程序序的申请时时,会遍历历该链表,寻寻找第一个个空间大于于所申请空空间的堆结结点,然后后将该结点点从空闲结结点链表中中删除,并并将该结点点的空间分分配给程序序,另外,对对于大多数数系统,会会在这块内内存空间中中的首地址址处记录本本次分配的的大小,这这样,代码码中的deeletee语句才能能正确的释释放本内存存空间。另另外,由于于找到的堆堆结点的大大小不一定定正好等于于

14、申请的大大小,系统统会自动的的将多余的的那部分重重新放入空空闲链表中中。(3)申请请大小的限限制栈:在在Winddows下下,栈是向向低地址扩扩展的数据据结构,是是一块连续续的内存的的区域。这这句话的意意思是栈顶顶的地址和和栈的最大大容量是系系统预先规规定好的,在在WINDDOWS下下,栈的大大小是2MM(也有的的说是1MM,总之是是一个编译译时就确定定的常数),如如果申请的的空间超过过栈的剩余余空间时,将将提示ovverfllow。因因此,能从从栈获得的的空间较小小。堆:堆堆是向高地地址扩展的的数据结构构,是不连连续的内存存区域。这这是由于系系统是用链链表来存储储的空闲内内存地址的的,自然是

15、是不连续的的,而链表表的遍历方方向是由低低地址向高高地址。堆堆的大小受受限于计算算机系统中中有效的虚虚拟内存。由由此可见,堆堆获得的空空间比较灵灵活,也比比较大。(4)申请请效率的比比较:栈:由系统自自动分配,速速度较快。但但程序员是是无法控制制的。堆:是由neew分配的的内存,一一般速度比比较慢,而而且容易产产生内存碎碎片,不过过用起来最最方便.另另外,在WWINDOOWS下,最最好的方式式是用Viirtuaal Allloc分分配内存,他他不是在堆堆,也不是是在栈,而而是直接在在进程的地地址空间中中保留一块块内存,虽虽然用起来来最不方便便。但是速速度快,也也最灵活。(5)堆和和栈中的存存储

16、内容栈栈:在函数数调用时,第第一个进栈栈的是主函函数中后的的下一条指指令(函数数调用语句句的下一条条可执行语语句)的地地址,然后后是函数的的各个参数数,在大多多数的C编编译器中,参参数是由右右往左入栈栈的,然后后是函数中中的局部变变量。注意意静态变量量是不入栈栈的。当本本次函数调调用结束后后,局部变变量先出栈栈,然后是是参数,最最后栈顶指指针指向最最开始存的的地址,也也就是主函函数中的下下一条指令令,程序由由该点继续续运行。堆堆:一般是是在堆的头头部用一个个字节存放放堆的大小小。堆中的的具体内容容由程序员员安排。(6)存取取效率的比比较char s1=aaaaaaaaaaaaaaaaaaa;c

17、char *s2=bbbbbbbbbbbbbbbbbbbbb;aaaaaaaaaaaaa是是在运行时时刻赋值的的;而bbbbbbbbbbbbbb是在编编译时就确确定的;但但是,在以以后的存取取中,在栈栈上的数组组比指针所所指向的字字符串(例例如堆)快快。比如:#inccludeevoiddmainn()charr a=11;chaar c=1123455678990;cchar *p=123445678890;a = c1;a = p11;reeturnn;对应的汇汇编代码110:a=c1;00440106678A44DF1mmovcll,bytteptrrebpp-0Fhh004401066

18、A8844DFCmmovbyytepttrebbp-4,cl111:a=p1;004401066D8B555ECmmoveddx,dwwordpptreebp-114h000401107088A42001movval,bbytepptreedx+11004401077388445FCmmovbyytepttrebbp-4,al第第一种在读读取时直接接就把字符符串中的元元素读到寄寄存器cll中,而第第二种则要要先把指针针值读到eedx中,在在根据eddx读取字字符,显然然慢了。21、什么么是预编译译,何时需需要预编译译?答:预编译译又称为预预处理,是是做些代码码文本的替替换工作。处处理#开头头的

19、指令,比如拷贝贝#inccludee包含的文文件代码,#defiine宏定定义的替换换,条件编编译等,就就是为编译译做的预备备工作的阶阶段,主要要处理#开开始的预编编译指令,预预编译指令令指示了在在程序正式式编译前就就由编译器器进行的操操作,可以以放在程序序中的任何何位置。c编译系统统在对程序序进行通常常的编译之之前,先进进行预处理理。c提供供的预处理理功能主要要有以下三三种:1)宏宏定义22)文件包包含3)条条件编译1、 总是使用不不经常改动动的大型代代码体。、程序由由多个模块块组成,所所有模块都都使用一组组标准的包包含文件和和相同的编编译选项。在在这种情况况下,可以以将所有包包含文件预预编

20、译为一一个预编译译头。22、关键键字connst是什什么含意?答:我只要要一听到被被面试者说说:“coonst意意味着常数数”,我就就知道我正正在和一个个业余者打打交道。去去年Dann Sakks已经在在他的文章章里完全概概括了coonst的的所有用法法,因此EESP(译译者:Emmbeddded SSysteems PProgrrammiing)的的每一位读读者应该非非常熟悉cconstt能做什么么和不能做做什么.如如果你从没没有读到那那篇文章,只只要能说出出consst意味着着“只读”就就可以了。尽尽管这个答答案不是完完全的答案案,但我接接受它作为为一个正确确的答案。(如如果你想知知道更详

21、细细的答案,仔仔细读一下下Sakss的文章吧吧。)如果果应试者能能正确回答答这个问题题,我将问问他一个附附加的问题题:下面的的声明都是是什么意思思?constt intt a;int cconstt a;constt intt *a;int * connst aa;int cconstt * aa connst;前两个的作作用是一样样,a是一一个常整型型数。第三三个意味着着a是一个个指向常整整型数的指指针(也就就是,整型型数是不可可修改的,但但指针可以以)。第四四个意思aa是一个指指向整型数数的常指针针(也就是是说,指针针指向的整整型数是可可以修改的的,但指针针是不可修修改的)。最最后一个意意

22、味着a是是一个指向向常整型数数的常指针针(也就是是说,指针针指向的整整型数是不不可修改的的,同时指指针也是不不可修改的的)。如果果应试者能能正确回答答这些问题题,那么他他就给我留留下了一个个好印象。顺顺带提一句句,也许你你可能会问问,即使不不用关键字字 connst,也也还是能很很容易写出出功能正确确的程序,那那么我为什什么还要如如此看重关关键字coonst呢呢?我也如如下的几下下理由:1). 关关键字coonst的的作用是为为给读你代代码的人传传达非常有有用的信息息,实际上上,声明一一个参数为为常量是为为了告诉了了用户这个个参数的应应用目的。如如果你曾花花很多时间间清理其它它人留下的的垃圾,

23、你你就会很快快学会感谢谢这点多余余的信息。(当当然,懂得得用connst的程程序员很少少会留下的的垃圾让别别人来清理理的。)2). 通通过给优化化器一些附附加的信息息,使用关关键字coonst也也许能产生生更紧凑的的代码。3). 合合理地使用用关键字cconstt可以使编编译器很自自然地保护护那些不希希望被改变变的参数,防防止其被无无意的代码码修改。简简而言之,这这样可以减减少bugg的出现23、关键键字vollatille有什么么含意 并并给出三个个不同的例例子。答:一个定定义为voolatiile的变变量是说这这变量可能能会被意想想不到地改改变,这样样,编译器器就不会去去假设这个个变量的值

24、值了。精确确地说就是是,优化器器在用到这这个变量时时必须每次次都小心地地重新读取取这个变量量的值,而而不是使用用保存在寄寄存器里的的备份。下下面是voolatiile变量量的几个例例子:1). 并并行设备的的硬件寄存存器(如:状态寄存存器)2). 一一个中断服服务子程序序中会访问问到的非自自动变量(Non-autoomatiic vaariabbles)3). 多多线程应用用中被几个个任务共享享的变量回答不出这这个问题的的人是不会会被雇佣的的。我认为为这是区分分C程序员员和嵌入式式系统程序序员的最基基本的问题题。嵌入式式系统程序序员经常同同硬件、中中断、RTTOS等等等打交道,所所用这些都都要

25、求voolatiile变量量。不懂得得volaatilee内容将会会带来灾难难。假设被面试试者正确地地回答了这这是问题(嗯嗯,怀疑这这否会是这这样),我我将稍微深深究一下,看看一下这家家伙是不是是直正懂得得volaatilee完全的重重要性。1). 一一个参数既既可以是cconstt还可以是是volaatilee吗?解释释为什么。2). 一一个指针可可以是voolatiile 吗吗?解释为为什么。3). 下下面的函数数有什么错错误:int ssquarre(voolatiile iint *ptr)returrn *pptr * *pttr;下面是答案案:1). 是是的。一个个例子是只只读的状

26、态态寄存器。它它是vollatille因为它它可能被意意想不到地地改变。它它是connst因为为程序不应应该试图去去修改它。2). 是是的。尽管管这并不很很常见。一一个例子是是当一个中中服务子程程序修该一一个指向一一个bufffer的的指针时。3). 这这段代码的的有个恶作作剧。这段段代码的目目的是用来来返指针*ptr指指向值的平平方,但是是,由于*ptr指指向一个vvolattile型型参数,编编译器将产产生类似下下面的代码码:int ssquarre(voolatiile iint *ptr)int aa,b;a = *ptr;b = *ptr;returrn a * b;由于*pttr的

27、值可可能被意想想不到地该该变,因此此a和b可可能是不同同的。结果果,这段代代码可能返返不是你所所期望的平平方值!正正确的代码码如下:long squaare(vvolattile int *ptrr)int aa;a = *ptr;returrn a * a;24、三种种基本的数数据模型答:按照数数据结构类类型的不同同,将数据据模型划分分为层次模模型、网状状模型和关关系模型。25、结构构与联合有有和区别?答:(1). 结构构和联合都都是由多个个不同的数数据类型成成员组成, 但在任任何同一时时刻, 联联合中只存存放了一个个被选中的的成员(所所有成员共共用一块地地址空间), 而结构构的所有成成员都

28、存在在(不同成成员的存放放地址不同同)。(2). 对于联联合的不同同成员赋值值, 将会会对其它成成员重写,原来成成员的值就就不存在了了, 而对对于结构的的不同成员员赋值是互互不影响的的26、描述述内存分配配方式以及及它们的区区别?答:1) 从静态存存储区域分分配。内存存在程序编编译的时候候就已经分分配好,这这块内存在在程序的整整个运行期期间都存在在。例如全全局变量,sstatiic 变量量。2) 在栈栈上创建。在在执行函数数时,函数数内局部变变量的存储储单元都可可以在栈上上创建,函函数执行结结束时这些些存储单元元自动被释释放。栈内内存分配运运算内置于于处理器的的指令集。3) 从堆上分配,亦称动

29、态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多27、请说说出connst与#defiine 相相比,有何何优点?答:Connst作用用:定义常常量、修饰饰函数参数数、修饰函函数返回值值三个作用用。被Coonst修修饰的东西西都受到强强制保护,可可以预防意意外的变动动,能提高高程序的健健壮性。1) coonst 常量有数数据类型,而而宏常量没没有数据类类型。编译译器可以对对前者进行行类型安全全检查。而而对后者只只进行字符符替换,没没有类型安安全检查,并并且

30、在字符符替换可能能会产生意意料不到的的错误。 2) 有些集成成化的调试试工具可以以对connst 常常量进行调调试,但是是不能对宏宏常量进行行调试。28、简述述数组与指指针的区别别?答:数组要要么在静态态存储区被被创建(如如全局数组组),要么么在栈上被被创建。指指针可以随随时指向任任意类型的的内存块。 (1)修改内容上的差别 char a = “hello”; a0 = X; char *p = “world”; / 注意p 指向常量字符串 p0 = X; / 编译器不能发现该错误,运行时错误 (2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是

31、一个 指针变量的字节数,而不是p 所指的内存容量。C+/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。 char a = hello world; char *p = a; cout sizeof(a) endl; / 12 字节 cout sizeof(p) endl; / 4 字节 计算数组和指针的内存容量 void Func(char a100) cout sizeof(a) endl; / 4 字节而不是100 字节 29、分别别写出BOOOL,iint,ffloatt,指针类类型的变量量a 与“零零”

32、的比较较语句。答:BOOOL : iif ( !a ) or if(aa)intt : iif ( a = 0)ffloatt :connst EEXPREESSIOON EXXP = 0.00000011 iff ( aa -EXXP)poointeer : if ( a != NUULL) or iif(a = NNULL) 30、如何何判断一段段程序是由由C 编译译程序还是是由C+编译程序序编译的?答:#iffdef _cppluspplusccoutc+;#elseecouttcc;#eendiff31、论述述含参数的的宏与函数数的优缺点点答: 带参宏宏 函数数处理时间 编编译时 程序

33、序运行时参数类型 没有有参数类型型问题 定义实参参、形参类类型处理过程 不分分配内存 分分配内存程序长度 变长长 不变变运行速度 不占占运行时间间 调用用和返回占占用时间32、用两两个栈实现现一个队列列的功能?要求给出出算法和思思路!答 、设22个栈为AA,B, 一开始均均为空.入队:将新元素ppush入入栈A;出队:(1)判断断栈B是否否为空;(2)如果果不为空,则则将栈A中中所有元素素依次poop出并ppush到到栈B;(3)将栈栈B的栈顶顶元素poop出;这样实现的的队列入队队和出队的的平摊复杂杂度都还是是O(1), 比上上面的几种种方法要好好33、嵌入入式系统中中经常要用用到无限循循环

34、,你怎怎么样用CC编写死循循环呢?答:这个问问题用几个个解决方案案。我首选选的方案是是:whilee(1)一些程序员员更喜欢如如下方案:for(;)这个实现方方式让我为为难,因为为这个语法法没有确切切表达到底底怎么回事事。如果一一个应试者者给出这个个作为方案案,我将用用这个作为为一个机会会去探究他他们这样做做的基本原理。如如果他们的的基本答案案是:“我我被教着这这样做,但但从没有想想到过为什什么。”这这会给我留留下一个坏坏印象。第三个方案案是用 ggotoLoop:.goto Loopp;应试者如给给出上面的的方案,这这说明或者者他是一个个汇编语言言程序员(这这也许是好好事)或者者他是一个个想

35、进入新新领域的BBASICC/FORRTRANN程序员。34、位操操作(Biit maanipuulatiion) 答: 嵌入入式系统总总是要用户户对变量或或寄存器进进行位操作作。给定一一个整型变变量a,写写两段代码码,第一个个设置a的的bit 3,第二二个清除aa 的biit 3。在在以上两个个操作中,要要保持其它它位不变。对这个问题有三种基本的反应1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。2) 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到 Infineon

36、为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。3) 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:#define BIT3 (0x1 3)static int a;void set_bit3(void) a |= BIT3;void clear_bit3(void) a &= BIT3; 一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几

37、个要点:说明常数、|=和&=操作。35、访问问固定的内内存位置(AAccesssingg fixxed mmemorry loocatiions) 答:嵌入式式系统经常常具有要求求程序员去去访问某特特定的内存存位置的特特点。在某某工程中,要要求设置一一绝对地址址为0x667a9的的整型变量量的值为00xaa666。编译译器是一个个纯粹的AANSI编编译器。写写代码去完完成这一任任务。这一一问题测试试你是否知知道为了访访问一绝对对地址把一一个整型数数强制转换换(typpecasst)为一一指针是合合法的。这这一问题的的实现方式式随着个人人风格不同同而不同。典典型的类似似代码如下下: intt *

38、pttr; pttr = (intt *)00x67aa9; *pttr = 0xaaa66;A moore oobscuure aapprooach is: 一个较晦晦涩的方法法是: *(intt * cconstt)(0xx67a9) = 00xaa555;即使使你的品味味更接近第第二种方案案,但我建建议你在面面试时使用用第一种方方案。36、中断断(Intterruupts)答: 中断断是嵌入式式系统中重重要的组成成部分,这这导致了很很多编译开开发商提供供一种扩展展让标准准C支持中中断。具代代表事实是是,产生了了一个新的的关键字 _innterrrupt。下下面的代码码就使用了了_innt

39、errrupt关关键字去定定义了一个个中断服务务子程序(ISR),请评论论一下这段段代码的。_interrupt double compute_area (double radius) double area = PI * radius * radius; printf(nArea = %f, area); return area;这个函数有太多的错误了,以至让人不知从何说起了:1)ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。2) ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。3) 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要

40、让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。4) 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。37、动态态内存分配配(Dynnamicc memmory alloocatiion) 答:尽管不不像非嵌入入式计算机机那么常见见,嵌入式式系统还是是有从堆(hheap)中中动态分配配内存的过过程的。那那么嵌入式式系统中,动动态分配内内存可能发发生的问题题是什么?这里,我我期望应试试者能提到到内

41、存碎片片,碎片收收集的问题题,变量的的持行时间间等等。这这个主题已已经在ESSP杂志中中被广泛地地讨论过了了(主要是是 P.JJ. Pllaugeer, 他他的解释远远远超过我我这里能提提到的任何何解释),所所有回过头头看一下这这些杂志吧吧!让应试试者进入一一种虚假的的安全感觉觉后,我拿拿出这么一一个小节目目:下面的的代码片段段的输出是是什么,为为什么?cchar *ptrr;if (pttr = (chaar *)mallloc(00) = NUULL) putss(Goot a nulll poiinterr);eelse pputs(Gott a vvalidd poiinterr);这

42、这是一个有有趣的问题题。最近在在我的一个个同事不经经意把0值值传给了函函数mallloc,得得到了一个个合法的指指针之后,我我才想到这这个问题。这这就是上面面的代码,该该代码的输输出是GGot aa vallid ppointter。我我用这个来来开始讨论论这样的一一问题,看看看被面试试者是否想想到库例程程这样做是是正确。得得到正确的的答案固然然重要,但但解决问题题的方法和和你做决定定的基本原原理更重要要些。38、Tyypedeef 答:Typpedeff 在C语语言中频繁繁用以声明明一个已经经存在的数数据类型的的同义字。也也可以用预预处理器做做类似的事事。例如,思思考一下下下面的例子子:#d

43、eefinee dPSS strruct s *ttypeddef sstrucct s * tPPS; 以上两两种情况的的意图都是是要定义ddPS 和和 tPSS 作为一一个指向结结构s指针针。哪种方方法更好呢呢?(如果果有的话)为为什么? 这是是一个非常常微妙的问问题,任何何人答对这这个问题(正正当的原因因)是应当当被恭喜的的。答案是是:typpedeff更好。思思考下面的的例子:ddPS pp1,p22;tPSS p3,p4;第第一个扩展展为strruct s * p1, p2; 上上面的代码码定义p11为一个指指向结构的的指,p22为一个实实际的结构构,这也许许不是你想想要的。第第二个

44、例子子正确地定定义了p33 和p44 两个指指针。39、用变变量a给出出下面的定定义答:a) 一个整型型数(Ann inttegerr)b) 一个个指向整型型数的指针针(A ppointter tto ann inttegerr)c) 一个个指向指针针的的指针针,它指向向的指针是是指向一个个整型数(AA poiinterr to a poointeer too an inteeger)d) 一个个有10个个整型数的的数组(AAn arrray of 110 inntegeers)e) 一个个有10个个指针的数数组,该指指针是指向向一个整型型数的(AAn arrray of 110 pooint

45、eers tto inntegeers)f) 一个个指向有110个整型型数数组的的指针(AA poiinterr to an aarrayy of 10 iinteggers)g) 一个个指向函数数的指针,该该函数有一一个整型参参数并返回回一个整型型数(A poinnter to aa funnctioon thhat ttakess an inteeger as aan arrgumeent aand rreturrns aan inntegeer)h) 一个个有10个个指针的数数组,该指指针指向一一个函数,该该函数有一一个整型参参数并返回回一个整型型数( AAn arrray of tten ppointters to ffuncttionss thaat taake aan inntegeerargumment and retuurn aan inntegeer )答案是:a) innt a; /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文献 > 管理工具

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁