语言、c常见面试题深入剖析-嵌入式_第1页
语言、c常见面试题深入剖析-嵌入式_第2页
语言、c常见面试题深入剖析-嵌入式_第3页
语言、c常见面试题深入剖析-嵌入式_第4页
语言、c常见面试题深入剖析-嵌入式_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.用预处理指令#define一个常数,用以表明1年中有多少秒(忽略闰年问题)#define语法的基本知识(例如:不能以分号结束,括号的使用,等等这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个答案:#defineSECONDS_PER_YEAR(60*60*24*365)UL2.写一个"标准"MIN,这个宏输入两个参数并返回较小的一个。标识#define(inline)操作符变为标准C语言中的原因是它使得编译器能产生比if-then-懂得在宏中地把参数用括号括起答案:#defineMIN(A,B)((A)B)(A)若是不把参数括起来,如#define (x*x),那如下语句:inta,b=3;a="SQR"(b+2)执行后的结果就为:11,因为第二条语句变为:a=b+2*b+2,即a=3+2*3+2,而非用变量a一个整型数(An一个指向整型数的指针(Apointertoan一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoan一个有10个整型数的数组(Anarrayof10一个有10个指针的数组,该指针是指向一个整型数的(Anarrayof10pointersto一个指向有10个整型数数组的指针(Apointertoanarrayof10一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargumentandreturnsan一个有10(Anarrayoftentofunctionsthattakeanintegerargumentandreturnaninteger)inta;//Anint*a;//Apointertoanint**a;//Apointertoapointertoaninta[10];//Anarrayof10int*a[10];//Anarrayof10pointerstoint(*a)[10];//Apointertoanarrayof10int(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsanint(*a[10])(int);//Anarrayof10pointerstofunctionsthattakeanintegerargumentreturn嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?{}static的作用是什么?在函数体,一个被为静态的变量在这一函数被调用过程中维持其值不变const我只要一听到被面试者说:"const意味着常数",我就知道我正在和一个业余者打交道。如果你const意味着"只读"就可以了。欲一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进初const;在一个函数中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值const类型,以使得其返回值不为“左值”constclassAoperator*(constclassA&a1,constclassA&operator*的返回结果必须是一个const对象。如果不是,这样的代码也不会编译出错classAa,b,(a*bc;//a*b操作(a*bc显然不符合编程者的初衷,也没有任何意义。constintintconstconstintint*constintconst*a前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,即使不用关键字const,const呢?我也如下的几下关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,一个参数为常量是这点多余的信息(当然,懂得用const的程序员很少会留下的让别人来清理的)constconst可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的bug的出现。volatile有什么含意?不可优化,一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器需要一个中断服务子程序中会到的非自动变量(Non-automaticconst还可以是volatile;volatile;intsquare(volatileint{return*ptr*}volatileconst因;buffer这段代码有点。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一volatileintsquare(volatileint{inta=b=returna*}由于*ptrablongsquare(volatileint{inta=returna*}置abit3,第二个清除abit3。在以上两个操作中,要保持其它位不变。用bitfields。Bitfields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移的你的代码是不可重用的。我最近不幸看到Infineon为其较复杂的通信写的驱动程序,它用到bitfields因此完全对我无用,因为我的编译器用其它的方式来实现bitfields的。从道德讲:不要让一个非嵌入式用#defines和bitmasks操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳#defineBIT3(0x1<<staticintvoid{a|=}void{a&=}|=和&=~地址为0x67a9的整型变量的值为0xaa66ANSI编译器。写代码去完成这一任务。intptr=(int*ptr=若寄存器的地址为 ,如何定义一个宏它的值#define void{unsignedinta=intb=-(a+b>6)?puts(">6"):puts("<=}C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大unsignedintzero=unsignedintcompzero=/*1'scomplementofzeroint型不是16unsignedintcompzero=~0;这一正能出应试者是否懂得处理器字长的重要性。在我的经PC机程序往往把硬件作为一个无Typedef在C语言中频繁用以一个已经存在的数据类型的同义字。也可以用预处理器做类似#definedPSstructstypedefstructs*dPStPSs指针。哪种方法更好呢?(如果dPStPSstructs*p1,.p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例p3和p4两个指针。a、b的值进行交换,并且不使用任何中间变量?如果有“inta="5",b=3”,则在执行了“!a&&b++;”abBOOL,int,float“零值”if语句(var)考查对0值判断的“内功”,BOOL型变量的0if(var==0)int型变量也可if(!var)if(!var),上述写法虽然程序都能正确运行,但是未能清晰if判断一个变量的“真”、“假”if(var)、if(!var),表明其为“逻辑”if判断一个数值型变量(short、int、long等)if(var==0),表明是与0进行“数值”if(var==NULL),这是一种很好的编程习惯。浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”if(x==0.0),则判为错。BOOL型变量:if(!var)intif(var==0)float型变量:constfloatEPSINON=if((x>=-EPSINON)&&(x<=指针变量:voidtest1(){charchar*str1= strcpy(string,str1}试题void{charstring[10],intfor(i=0;i<10;{str1[i]=}strcpy(string,str1}试题voidtest3(char*{charif(strlen(str1)<=10{strcpy(string,str1}}试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’)string只有10间,strcpy对试题2,如果面试者字符数组str1不能在数组内结束可以给3分如果面试者strcpy(string,str1)调用使得从str1内存起到string内存起所的字节数具有不确定性可以给7分,在此基础上库函数strcpy工作方式的给10分;对试题3,if(strlen(str1)10)应改为if(strlen(str1)10),因为strlen的结果未统计’\0’所占用的1个字节。(1)字符串以’\0’结尾(2)(3)库函数strcpystrcpy函数的总分值为10,下面给出几个不同2voidstrcpy(char*strDest,char*strSrc{while((*strDest++=*strSrc++)!=‘\0’}4voidstrcpy(char*strDest,constchar*strSrc//const,表明其为输入参数,加2{while((*strDest++=*strSrc++)!=‘\0’}7voidstrcpy(char*strDest,constchar{//对源地址和目的地址加非0断言,加3assert((strDest!=NULL)&&(strSrc!=NULL)while((*strDest++=*strSrc++)!=‘\0’}10//为了实现链式操作,将目的地址返回,加3char*strcpy(char*strDest,constchar*strSrc{assert((strDest!=NULL)&&(strSrc!=NULL)char*address=while((*strDest++=*strSrc++)!=‘\0’return}从2分到10分的几个答案我们可以清楚的看到小小的strcpy竟然暗藏着这么多真不是盖的!strcpy啊!(4)strlen的掌握,它没有包括字符串末尾的'\0'strcpy版本,应该也可以写出一个10strlenintstrlenconstchar*str{assert(strtNULL断言字符串地址非0intlen;while((*str++)!='\0'{}return}voidGetMemory(char*p{p=(char*)malloc(100}voidTest(void{char*str=GetMemory(strstrcpy(str,"oworld"printf(str}试题char*GetMemory(void{charp[]="oreturn}voidTest(void{char*str=str=printf(str}试题voidGetMemory(char**p,intnum{*p=(char*)malloc(num}voidTest(void{char*str=GetMemory(&str,100strcpy(str,"o"printf(str}试题voidTest(void{char*str=(char*)malloc(100strcpy(str,"o"free(str}试题4GetMemory(char*p函数的形参为字符串指针,在函数内部修改形参并不能真正的改char*str=GetMemory(strstrNULL;试题5中charp[]="oreturn试题6GetMemory避免了试题4GetMemoryGetMemory*p=(char*)malloc(numif(*p==NULL{}试题7存在与试题6char*str=(char*)后未进行内存是否申请成功的判断;另外,在free(str)str为空,导致可能变成一个“野”指str=试题6的Testmalloc的内存进行释放。试题4~7考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正确的回答其中的swap(int*p1,int*p2){int*p=*p1=*p2=}运行时提示错误“AccessViolation”。该程序应该改为:swap(int*p1,int*p2){p}WindowsNT下的32C++sizeofvoidFunc(charstr[100]{sizeof(str)=}void*p=malloc(100sizeof(p)=sizeof(str)=sizeof(p)=Func(charstr[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,charcout<<sizeof(str)<<输出结果为10,strchar[10]不charstr+strWindowsNT32位平台下,指针的长度(占用内存的大小)为4sizeof(str)sizeofp)都为4#ifndefINCvxWorksh#define#ifndef#define的作用是防止头文件被重复char组成的字符串循环右移n个。比如原来是“abcdefghi”n=2,移位后应该是“hiabcdefgh”//pStr是指向以'\0'结尾的字符串的指//steps是要求移动的voidLoopMove(char*pStr,intsteps{//请填充}正确解答voidLoopMove(char*pStr,i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论