C语言笔试题C笔试题大全14附答案.docx
《C语言笔试题C笔试题大全14附答案.docx》由会员分享,可在线阅读,更多相关《C语言笔试题C笔试题大全14附答案.docx(28页珍藏版)》请在冰豆网上搜索。
C语言笔试题C笔试题大全14附答案
c语言常见笔试题总结
【1使用宏】
1.1#error的作用?
#error用于向编译器报错,并输出它后面带的错误信息。
例如:
#ifndefSOMETHING
#errorSOMETHINGnotdefined!
#endif
如果在这段代码之前未定义过SOMETHING,则在编译时出错,并给出"SOMETHINGnotdefined!
"的错误信息。
1.2定义一个宏,求出给定数组中的元素的个数
#defineNELEMENTS(array)(sizeof(array)/sizeof((array)[0]))
【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[10])(int);
【3复杂类型
(1)】
有如下表达式:
char(*(*x())[])();
请用文字描述x是什么。
首先,确定标识符:
x
x是一个函数,没有参数:
x()
返回值是一个指针:
*x()
这个指针指向一个数组:
(*x())[]
数组中的每个元素是指针:
*(*x())[]
指向一个不带参数的函数:
(*(*x())[])()
函数的返回值是char:
char(*(*x())[])()
这里,要知道*、()和[]的优先级
【5头文件】
问:
为什么标准头文件都有类似以下的结构?
#ifndef__INCvxWorksh
#define__INCvxWorksh
#ifdef__cplusplus
extern"C"{
#endif
/*...*/
#ifdef__cplusplus
}
#endif
#endif
在编译源文件时,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()的输出?
c语言笔试题(九)
1.
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;
structS_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是2字节默认按2字节对齐,指定对齐参数为8,这两个值中取2,a按2字节对齐;成员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语言笔试题(七)
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关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?
为什么?
答:
可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
4、语句for(;1;)有什么问题?
它是什么意思?
答:
和while
(1)相同。
5、do……while和while……do有什么区别?
答:
前一个循环一遍再判断,后一个判断以后再循环
6、请写出下列代码的输出内容
#include
main()
{
inta,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c,d:
%d,%d,%d",b,c,d);
return0;
}
答:
10,12,120
1、static全局变量与普通的全局变量有什么区别?
static局部变量和普通局部变量有什么区别?
static函数与普通函数有什么区别?
全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static函数与普通函数作用域不同。
仅在本文件。
只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。
对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static全局变量与普通的全局变量有什么区别:
static全局变量只初使化一次,防止在其他文件单元中被引