c笔试题大全_附答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

c语言常见笔试题总结【1使用宏】1.1#ifdefNDEBUG#defineTRACE(S)S#else#defineTRACE(S)printf(%s;\n,#S);S#endif问:以上TRACE()宏的作用是什么?如果定义了DEBUG这个宏,TRACE的作用就是跟踪程序的执行过程,便于查找出错位置,否则TRACE被直接替换为原语句。1.2#error的作用?#error用于向编译器报错,并输出它后面带的错误信息。例如:#ifndefSOMETHING#errorSOMETHINGnotdefined!#endif如果在这段代码之前未定义过SOMETHING,则在编译时出错,并给出SOMETHINGnotdefined!的错误信息。1.3定义一个宏,求出给定数组中的元素的个数#defineNELEMENTS(array)(sizeof(array)/sizeof((array)[0]))1.4定义一个宏,求出给定结构中给定成员的偏移量#defineOFFSET(structure,member)((int)&(((structure*)0)-member))【2数据声明和定义】给定以下类型的变量a的定义式:a)Anintegerinta;b)Apointertoanintegerint*a;c)Apointertoapointertoanintegerint**a;d)Anarrayof10integersinta[10];e)Anarrayof10pointerstointegersint*a[10];f)Apointertoanarrayof10integersint(*a)[10];g)ApointertoaIfunction/Ithattakesanintegerasanargumentandreturnsanintegerint(*a)(int);h)AnarrayoftenpointerstoIfunction/Isthattakeanintegerargumentandreturnanintegerint(*a(int))[10];【3复杂类型(1)】有如下表达式:char(*(*x())[])();请用文字描述x是什么。首先,确定标识符:xx是一个函数,没有参数:x()返回值是一个指针:*x()这个指针指向一个数组:(*x())[]数组中的每个元素是指针:*(*x())[]指向一个不带参数的函数:(*(*x())[])()函数的返回值是char:char(*(*x())[])()这里,要知道*、()和[]的优先级【4复杂类型(2)】jmp_buf的定义:typedefstruct_jmp_buf{REG_SETreg;intextra[3];}jmp_buf[1];setjmp函数的原型:externintsetjmp(jmp_buf__env);问:调用setjmp时传递__env的内容,还是传递指针?数组名作为函数参数时,应该是传递地址/指针【5头文件】问:为什么标准头文件都有类似以下的结构?#ifndef__INCvxWorksh#define__INCvxWorksh#ifdef__cplusplusexternC{#endif/*...*/#ifdef__cplusplus}#endif#endif/*__INCvxWorksh*/在编译源文件时,C编译器和C++编译器都会对符号(函数或变量)名作某些修正,但两者采用的修正方法不同,所以两者生成的目标文件不能互相链接。在C++中使用externC可以让C++符号获得C链接特性。由于C++编译器会自动定义__cplusplus宏,所以在C语言头文件中采用这种结构可以保证无论使用何种编译器,生成的目标文件都具有C链接特性,能够与标准C编译器所生成的目标文件相链接【6static关键字】请说出static关键字的3种用处:(1)用于全局变量;外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。(2)用于局部变量;局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。(3)用于函数。内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。/*file.c*/staticinta;intb;staticintfn(){staticintx;inty;}【7const关键字】7.1const关键字的意义是什么?7.2解释以下的变量定义:constinta1;a1是整型常量。intconsta2;a2是整型常量。等同于constinta2。constint*a3;a3是指针(a3是可变的),指向一个整型常量。等同于intconst*a3。int*consta4;a4是常量指针(a4不可变),指向一个整型变量。intconst*consta5;a5是常量指针(a5不可变),指向一个整型常量。等同于constint*consta5。【8volatile关键字】8.1volatile意义?例如volatileint*p;8.2volatile能和const一起使用吗?const关键字的意思是限制编程者自己不能修改变量的值;两者并不矛盾。例如一个内存映射的、只读的硬件寄存器,假设它的地址是p,则可以这样声明:volatileconstUINT32*p;【9sizeof()】有以下定义:char*pmsg=A;charmsg[]=A;charch='A';问:sizeof(pmsg)=?4sizeof(msg)=?2sizeof(“A”)=?2sizeof(ch)=?1sizeof(‘A’)=?(在C++中等于多少?)(在C语言中,字符常量的数据类型实际上是int;在C++中,它的数据类型是char,从而原式等于1)voidf(charparam[100]){//sizeof(param)=?4}【10字符串】有以下代码char*pmsg=hello,world!;strcpy(pmsg,hi,there.);试评论该代码。【11混合运算】有以下代码:voidfoo(){unsignedinta=6;intb=-20;(a+b6)?puts(6):puts(=6);}请问调用foo()的输出?【12内存访问】有以下代码:voidfn(){inta[100];int*p;p=(int*)((unsignedint)a+1);printf(“p=0x%x\n”,*p);}试评论以上代码。【13C库函数】请说明以下函数的意义:voidperror(constchar*__s);fdprintf(int,constchar*,...);isspace(),isxdigit(),strerr(),sprintf()c语言笔试题(九)1.#includestdio.hintmain(){inta;int*p;p=&a;*p=0x500;a=(int)(*(&p));a=(int)(&(*p));if(a==(int)p)printf(equal!\n);elseprintf(notequal!\n);}请问本程序的输出显示是什么?答案:输出显示为”equal!”2.struct{signedintbit0:1;signedintbit1:1;signedintbit2:1;signedintbit3:1;signedintbit4:1;signedintbit5:1;signedintbit6:1;signedintbit7:1;}bits;请问sizeof(bits)是否是正确的表达式?请问语句bitsmybits;的定义是否正确?如果不正确,要如何修改上述的结构定义才能使该语句正确?修改后的结构定义是否会影响sizeof(bits)的正确性?如果正确则该表达式的值为多少?如果将上述的结构中int类型改为char类型,此时sizeof(bits)的大小为多少?答案:1)是正确的表达式,因为sizeof后面的内容可以是类型,也可以是变量。2)该语句的定义不正确,因为此时的bits为一个变量;应该这样修改结构的定义typedefstruct{signedintbit0:1;signedintbit1:1;signedintbit2:1;signedintbit3:1;signedintbit4:1;signedintbit5:1;signedintbit6:1;signedintbit7:1;}bits;修改后sizeof(bits)表达式依然正确,其值为4;类型改为char后其值为1,注意该值是在VC环境中的32位程序中得到的值,在不同的编译器其值有可能不同,因此在编程时不能自己假定类似结构的大小。3.structbit{unsignedinta[0]:1,a[1]:1,a[2]:1….a[7]:1;}请问这种写法是否正确?为什么?答案:不正确,位域中的变量不能是数组。4.structa{intx;chary;structaz;structa*p;}请问这种定义结构正确否?如果有问题,问题在哪里?答案:结构中不能对定义结构本身的非指针变量,如果编译器支持则会导致无限嵌套,因此一般编译器都会认为structa是未定义的类型,即使提前声明也不会有任何用处。5.什么是可重入函数?C语言中写可重入函数,应注意的事项?答案:可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果的正确性的函数。在编写可重入函数时通常要注意如下的一些问题:尽量不要使用全局变量,静态变量,如果使用了应该注意对变量访问的互斥。通常可以根据具体的情况采用:信号量机制,关调度机制,关中断机制等方式来保证函数的可重入性。不要调用不可重入的函数,调用了不可重入的函数会使该函数也变为不可重入的函数。注意对系统中的临界资源,互斥资源的访问方式,防止使函数成为不可重入的函数。一般驱动程序都是不可重入的函数,因此在编写驱动程序时一定要注意重入的问题。6.简述stackframe的含义。答案:stackframe的中文译名为:栈框架,表示函数在栈空间的调用层次,7.printf(“%d%d\n”,++n,power(2,n));其中power(2,n)为实现一定功能的函数如2^n。请问这种表示方法有什么潜在的问题?答案:编译器的不同,对++n和power(2,n)处理的先后顺序不一样,形成二义性,造成程序的移植性差,因此最好把++n写在printf函数外面,以消除二义性。8.printf(s);请问这样的语句有没有问题?(s为一指向有效字符串的指针)答案:没有%的话,可以这样表达,如果有%在s中的话,有意想不到的输出结果。9.两段代码共存于一个文件,编译时有选择的编译其中的一部分,请问如何实现?答案:有两种简单的办法可以实现:在源码中使用条件编译语句,然后在程序文件中定义宏的形式来选择需要的编译代码。在源码中使用条件编译语句,然后在编译命令的命令中加入宏定义命令来实现选择编译。10.数据结构指针传给函数,函数能访问数据单元,但不能修改实际的内容,如何实现?答案:定义为指向常量的指针,这样指针所指的数据结构中的内容就不会被改变。如:const类型*p或类型const*p11.在头文件中定义静态变量,可能产生什么问题?答案:在使用了该头文件的每个c程序文件中都单独存在一个该静态变量,这样造成空间的浪费并且很容易引起错误。因此建议不要在头文件中定义任何变量。12.malloc()与calloc()的区别?答案:1)参数上的区别malloc(size_tsize);calloc(size_tn,size_tsize);malloc分配一块size大小的内存块,而calloc分配一个n*size大小的内存块2)返回内存块的状态不同malloc分配的内存块没有被清零,而calloc分配的内存块是清了零的。但是建议在使用内存时,如果需要初始化,则最好自己按照需要来进行初试化,不要依赖函数的实现说明。13.寄存器变量可不可以访问其地址?可否是全局

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功