c笔试题大全附答案.docx

上传人:b****5 文档编号:4599293 上传时间:2022-12-07 格式:DOCX 页数:49 大小:41.50KB
下载 相关 举报
c笔试题大全附答案.docx_第1页
第1页 / 共49页
c笔试题大全附答案.docx_第2页
第2页 / 共49页
c笔试题大全附答案.docx_第3页
第3页 / 共49页
c笔试题大全附答案.docx_第4页
第4页 / 共49页
c笔试题大全附答案.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

c笔试题大全附答案.docx

《c笔试题大全附答案.docx》由会员分享,可在线阅读,更多相关《c笔试题大全附答案.docx(49页珍藏版)》请在冰豆网上搜索。

c笔试题大全附答案.docx

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)Aninteger

inta;

b)Apointertoaninteger

int*a;

c)Apointertoapointertoaninteger

int**a;

d)Anarrayof10integers

inta[10];

e)Anarrayof10pointerstointegers

int*a[10];

f)Apointertoanarrayof10integers

int(*a)[10];

g)Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger

int(*a)(int);

h)Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger

int(*a(int))[10];

【3复杂类型

(1)】

有如下表达式:

char(*(*x())[])();

请用文字描述x是什么。

首先,确定标识符:

x

x是一个函数,没有参数:

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__cplusplus

extern"C"{

#endif

/*...*/

#ifdef__cplusplus

}

#endif

#endif/*__INCvxWorksh*/

在编译源文件时,C编译器和C++编译器都会对符号(函数或变量)名作某些修正,但两者采用的修正方法不同,所以两者生成的目标文件不能互相链接。

在C++中使用extern"C"可以让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)=?

4

sizeof(msg)=?

2

sizeof(“A”)=?

2

sizeof(ch)=?

1

sizeof(‘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+b>6)?

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.#include"stdio.h"

intmain()

{

inta;

int*p;

p=&a;

*p=0x500;

a=(int)(*(&p));

a=(int)(&(*p));

if(a==(int)p)

printf("equal!

\n");

else

printf("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*p

11.在头文件中定义静态变量,可能产生什么问题?

答案:

在使用了该头文件的每个c程序文件中都单独存在一个该静态变量,这样造成空间的浪费并且很容易引起错误。

因此建议不要在头文件中定义任何变量。

12.malloc()与calloc()的区别?

答案:

1)参数上的区别

malloc(size_tsize);

calloc(size_tn,size_tsize);

malloc分配一块size大小的内存块,而calloc分配一个n*size大小的内存块

2)返回内存块的状态不同

malloc分配的内存块没有被清零,而calloc分配的内存块是清了零的。

但是建议在使用内存时,如果需要初始化,则最好自己按照需要来进行初试化,不要依赖函数的实现说明。

13.寄存器变量可不可以访问其地址?

可否是全局变量?

在什么场合使用寄存器变量?

答案:

这些问题都与编译器的实现有关,建议不要声明全局变量为寄存器变量,即使是局部变量都最好不要声明其为寄存器变量,现在的编译器在优化时都会较为合理的安排寄存器变量的使用,而人为的安排有时会造成优化的低效。

14."\n"'\n'的区别?

答案:

前者是一个字符串并且以’/0’结束,而后者只是一个简单的字符。

15.包含预定义头文件<>和""的区别?

答案:

<>只在指定的目录里寻找被包含文件;""先在当前目录下查找,再在指定目录下查找;通常<>方式用于系统的头文件,而一般用户的头文件用""的方式。

16.struntS_A{

inta[10];

};

voidf()

{

inti;

struntS_A*s_ptr;

for(i=0,i<10,i++)

s_ptr->a[i]=i;

}

请问这段代码正确否?

答案:

这段代码不正确,没有对s_ptr指针进行初始化,在编程中要注意此类低级错误的发生。

c语言笔试题(八)

1.  #pragmapack(8)

  structs1{

  shorta;

  longb;

  };

  structs2{

  charc;

  s1d;

  longlonge;

  };

  #pragmapack()

问:

  1.sizeof(s2)=?

24

  2.s2的s1中的a后面空了几个字节接着是b?

2

答:

  sizeof(S2)结果为24.

  成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.

  也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.

  S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;

  S2中,c和S1中的a一样,按1字节对齐,而d是个结构,它是8个字节,它按什么对齐呢?

对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节.

  ab

  S1的内存布局:

11**,1111,

  cS1.aS1.bd

  S2的内存布局:

1***,11**,1111,****11111111

  这里有三点很重要:

  1.每个成员分别按自己的方式对齐,并能最小化长度

  2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度

  3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐

  有程序查一下各个变量的内存地址得知:

  各个变量在内存中的位置为

  c***aa**

  bbbb****

  dddddddd

  测试代码为:

  s2ss;

  cout<<"ss.c="<<&ss<

  cout<<"ss.d.a="<<&ss.d.a<

  cout<<"ss.d.b="<<&(ss.d.b)<  cout<<"ss.d="<<&ss.e<

  printout各个变量的内存地址不就可以看出来了吗。

  所以答案是24,2.

  但是我的想像中应该是这样的分布情况:

  c*******

  aa**bbbb

  dddddddd

  不知为什么会c和a放在一起,组成8位长度。

c语言笔试题(七)

1.找错

Voidtest1()

{

charstring[10];

char*str1="0123456789";

strcpy(string,str1);//string数组溢出

}

Voidtest2()

{

charstring[10],str1[10];

for(i=0;i<10;i++)

{

str1[i]='a';

}

strcpy(string,str1);//str必须是字符串

}

Voidtest3(char*str1)

{

charstring[10];

if(strlen(str1)<=10)//strlen不统计‘\0’字符

{

strcpy(string,str1);

}

}

2.找错

#defineMAX_SRM256

DSNget_SRM_no()

{

staticintSRM_no;

intI;

for(I=0;II

{

SRM_no%=MAX_SRM;

if(MY_SRM.state==IDLE)

{

break;

}

}

if(I>=MAX_SRM)

return(NULL_SRM);

else

returnSRM_no;

}

3.写出程序运行结果

intsum(inta)

{

autointc=0;

staticintb=3;

c+=1;

b+=2;

return(a+b+C);

}

voidmain()

{

intI;

inta=2;

for(I=0;I<5;I++)

{

printf("%d,",sum(a));

}

}

答:

8,10,12,14,16,

4.

intfunc(inta)

{

intb;

switch(a)

{

case1:

b=30;

case2:

b=20;

case3:

b=16;

default:

b=0;

}

returnb;

}

则func

(1)=?

//0,因为没有break;

5:

inta[3];

a[0]=0;a[1]=1;a[2]=2;

int*p,*q;

p=a;

q=&a[2];

则a[q-p]=?

2

6.

定义int**a[3][4],则变量占有的内存空间为:

__48__

7.

编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。

如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。

c语言笔试题(六)

4.static有什么用途?

(请至少说明两种)

1.限制变量的作用域

2.设置变量的存储域

7.引用与指针有什么区别?

1)引用必须被初始化,指针不必。

2)引用初始化以后不能被改变,指针可以改变所指的对象。

2)不存在指向空值的引用,但是存在指向空值的指针。

8.描述实时系统的基本特性

在特定时间内完成特定的任务,实时性与可靠性

9.全局变量和局部变量在内存中是否有区别?

如果有,是什么区别?

全局变量储存在静态数据库,局部变量在堆栈

10.什么是平衡二叉树?

左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1

11.堆栈溢出一般是由什么原因导致的?

没有回收垃圾资源

12.什么函数不能声明为虚函数?

constructor

13.冒泡排序算法的时间复杂度是什么?

O(n^2)

14.写出floatx与“零值”比较的if语句。

if(x>0.000001&&x<-0.000001)

16.Internet采用哪种网络协议?

该协议的主要层次结构?

tcp/ip应用层/传输层/网络层/数据链路层/物理层

17.Internet物理地址和IP地址转换采用什么协议?

ARP(AddressResolutionProtocol)(地址解析協議)

18.IP地址的编码分为哪俩部分?

IP地址由两部分组成,网络号和主机号。

不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。

2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。

写出C程序。

循环链表,用取余操作做

3.不能做switch()的参数类型是:

switch的参数不能为实型。

華為

1、局部变量能否和全局变量重名?

答:

能,局部会屏蔽全局。

要用全局变量,需要使用":

:

"

局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。

对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内

2、如何引用一个已经定义过的全局变量?

答:

extern

可以用引用头文件的方式,也可以用extern关键字,如

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1