《c语言面试题总汇.pdf》由会员分享,可在线阅读,更多相关《c语言面试题总汇.pdf(69页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、瀚海星云-同主题文章阅读讨论区:J o b 版主:w Zh Ou w q s t a r d a v y x u n回复本文本讨论区g e t l T979 15008 5477 364本文:转寄 转贴 删除 修改 回复 作者:g e t l T 人气:7 69发 信 人:g e t l T(l e a r n i n g),信 区:J o b标 题:C 语言面试题大汇总 ZZ发信站:瀚 海 星 云(2 0 0 6年 1 1 月 0 8 日 1 4:3 2:1 4 星期三),站内信件W W W P 0 ST4.s t a t i c 有什么用途?(请至少说明两种)1 .限制变量的作用域2 .设
2、置变量的存储域7 .引用与指针有什么区别?1)引用必须被初始化,指针不必。2)引用初始化以后不能被改变,指针可以改变所指的对象。2)不存在指向空值的引用,但是存在指向空值的指针。8 .描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性9.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈1 0 .什么是平衡二叉树?左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于11 1 .堆栈溢出一般是由什么原因导致的?没有回收垃圾资源1 2 .什么函数不能声明为虚函数?c o n s t r u c t o r1 3 .冒泡排序算法的时间
3、复杂度是什么?0(n 2)1 4 .写出f l o a t x与“零值”比较的i f 语句。i f(x 0.0 0 0 0 0 1&x m a i n()3、4、c h a r*s r c=,/h e l l o,w o r l d”;5、c h a r*d e s t=N U L L;6、i n t l e n=s t r l e n(s r c);7、d e s t=(c h a r*)m a l l o c (l e n);8、c h a r*d=d e s t;9、c h a r*s=s r c l e n ;1 0、w h i l e(l e n-!=0)1 1、d+=s-;1 2、
4、printfdest);1 3 r e t u r n 0;1 4、答:方 法 1:i n t m a i n ()c h a r*s r c =h e l l o,w o r l d”;i n t l e n =s t r l e n(s r c);c h a r*d e s t =(c h a r*)m a l l o c(l e n+l);要为 0 分配一个空间c h a r*d =d e s t;c h a r*s =&s r c l e n T ;指向最后一个字符w h i l e(l e n-!=0 )*d+=*s ;*d =0;尾部要加 0p r i n t f (s n ,d
5、e s t);f r e e(d e s t);使 用 完,应当释放空间,以免造成内存汇泄露r e t u r n 0;)方法2:#i n c l u d e#i n c l u d em a i n O(c h a r s t r 口=“h e l l o,w o r l d”;i n t l e n=s t r l e n(s t r);c h a r t;f o r (i n t i=0;i t=s t r i ;s t r i =s t r l e n-i-1;s t r l e n-i-l =t;)printfstr);r e t u r n 0;l.-l,2,7,28,126请问2
6、8 和 126中间那个数是什么?为什么?第一题的答案应该是3-1=63规律是n.3T(当 n为偶数0,2,4)n 3+l (当 n 为奇数 1,3,5)答 案:632.用两个栈实现一个队列的功能?要求给出算法和思路!设 2 个栈为A,B,一开始均为空.入队:将新元素p u s h 入栈A;出队:(1)判断栈B是否为空;(2)如果不为空,则将栈A中所有元素依次p o p 出并p u s h 到栈B;(3)将栈B的栈顶元素p o p H l;这样实现的队列入队和出队的平摊复杂度都还是0(1),比上面的几种方法要好。3.在c 语言库函数中将一个字符转换成整型的函数是a t o o l()吗,这个函数
7、的原型是什么?函数名:a t o l功 能:把字符串转换成长整型数用 法:l o n g a t o l (c o n s t c h a r *n p t r);程序例:f t i n c l u d eSi n c l u d ei n t m a i n(v o i d)(l o n g 1;c h a r *s t r =9 8 7 65432”;1=a t o l(I s t r);p r i n t f(s t r i n g =%s i n t e g e r =s t r,1);r e t u r n(0);)2.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C+中应用
8、什么实现?c 用宏定义,C+用 i n l i n e3.直接链接两个信令点的一组链路称作什么?P P P 点到点连接4.接入网用的是什么接口?5.v o i p 都用了那些协议?6.软件测试都有那些种类?黑盒:针对系统功能的测试白合:测试函数功能,各函数接口7 .确定模块的功能和模块的接口是在软件设计的那个队段完成的?概要设计阶段8 .e n u m s t r i n gx l,x 2,x 3=10,x 4,x 5,x;问 x=0 x 8 01005,0 x 8 010f 4;9.u n s i g n e d c h a r *p l;u n s i g n e d l o n g *p
9、 2;p l=(u n s i g n e d c h a r *)0 x 8 01000;p 2=(u n s i g n e d l o n g *)0 x 8 10000;请问p l+5=;p 2+5=;三.选择题:1.E t h t e r n e t 链接到I n t e r n e t 用到以下那个协议?A.H D LC;B.A RP;C.U D P;D.TC P;E.I D2.属于网络层协议的是:A.TC P;B.I P;C.I C M P;D.X,253.Wi n d o w s 消息调度机制是:A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;4.u n s i g n
10、 e d s h o r t h a s h(u n s i g n e d s h o r t ke y)r e t u r n (ke y )%256请 问 h a s h(16),h a s h(256)的值分别是:A.1.16;B.8.32;C.4.16;D.1.32四.找错题:1.请问下面程序有什么错误?i n t a 60 250 10 0 0,i,j,k;fo r(k=0;k=10 0 0;k+)fo r(j=0;j 250;j+)fo r(i=0;i M a x _GT L e n gt h)(r e t u r n GT_L e n gt h_ER R O R;)五.问答题:
11、1.IP P ho n e 的原理是什么?IP V62.TCP/IP 通信建立的过程怎样,端口有什么作用?三次握手,确定是哪个应用程序使用该协议3.1号信令和7 号信令有什么区别,我国某前广泛使用的是那一种?4.列举5 种以上的电话新业务?微软亚洲技术中心的面试题!1.进程和线程的差别。线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.(4)
12、系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。2.测试方法人工测试:个人复查、抽查和会审机器测试:黑盒测试和白盒测试2.H e a p 与 s t a ck 的差别。H e a p 是堆,s t a ck 是栈。S t a ck 的空间由操作系统自动分配/释放,H e a p 上的空间手动分配/释放。S t a ck 空间有限,H e a p 是很大的自由存储区C 中的m a l l o c函数分配的内存空间即在堆上,C+中对应的是n e w 操作符。程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递
13、也在栈上进行3 .W i ndo w s 下的内存是如何管理的?4.介绍,Net 和.Net 的安全性。5.客户端如何访问.Net 组件实现W eb S er v i c e?6.C/C+编译器中虚表是如何完成的?7 .谈谈C O M的线程模型。然后讨论进程内/外组件的差别。8 .谈 谈 IA 3 2 下的分页机制小页(4K)两级分页模式,大页(4M)一级9 .给两个变量,如何找出一个带环单链表中是什么地方出现环的?一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方10 .在 1A 3 2 中共有多少种办法从用户态跳到内核态?通过调用门,从 r i ng3 到 r i ng。,中断从
14、r i ng3 到 r i ng。,进入v m8 6等等11.如果只想让程序有一个实例运行,不能运行两个。像 w i na ni p 样,只能开一个窗口,怎样实现?用内存映射或全局原子(互斥变量)、查找窗口句柄.Fi ndW i ndo w,互斥,写标志到文件或注册表,共享内存。.12 .如何截取键盘的响应,让 所 有 的 a 变 成 b,?键盘钩子 S et W i ndo w s Ho o k Ex13 .A p a r t ment 在 C O M中有什么用?为什么要引入?14.存储过程是什么?有什么用?有什么优点?我的理解就是堆s q l的集合,可以建立非常复杂的查询,编译运行,所 以
15、 运 行 次后,以后再运行速度比单独执行S Q L快很多15.T emp la t e有什么特点?什么时候用?16.谈谈W i ndo w s D NA 结构的特点和优点。网络编程中设计并发服务器,使 用 多 进 程 与 多 线 程,请问有什么区别?1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。两者都可以提高程序的并发度,提高程序运行效率和响应时间。线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。
16、同时,线程适合于在S M P 机器上运行,而进程则可以跨机器迁移。思科1.用宏定义写出s w a p (x,y)#d e f i ne s w a p(x,y)x =x +y;y =x -y;x =x -y;2 .数组a N ,存放了 1 至 NT个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为。(N)函数原型:i nt d o _ d u p(i nt a ,i nt N)3 一语句实现x是否为2的 若 次豪的判断i nt i =5 1 2;c o u t b o o la lp h a (i&(i -1)?f a ls e :t r u e)e nd l;4.u n
17、s i g ne d i nt i nt ve r t (u ns i g ne d i nt x,i nt p,i nt n)实现对 x 的进行转换,p 为起始转化位,n 为需要转换的长度,假设起始点在右边.如x=0 b 0 0 0 1 0 0 0 1,p=4,n=3 转换后x=0 b 0 1 1 0 0 0 0 1u ns i g ne d i nt i nt ve r t(u ns i g ne d i nt x,i nt p,i nt n)u ns i g ne d i nt _ t =0;u ns i g ne d i nt _ a =1;f o r(i nt i =0;i n;+i
18、)_ t 1=_ a;_ a =_ a 1;)_ t =_ t p;X =_ t;r e t u r n x;慧通:什么是预编译何时需要预编译:1、总是使用不经常改动的大型代码体。2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。c h a r *c o ns t p;c h a r c o ns t *pc o ns t c h a r *p上述三个有什么区别?c h a r *c o ns t p;常量指针,p 的值不可以修改c h ar c ons t *p;指向常量的指针,指向的常量值不可以改c ons t
19、c h ar *p;和 c h ar c ons t *pc h ar s t r l =ab c ;c h ar s t r 2 =ab c ;c ons t c h ar s t r 3 =ab c ;c ons t c h ar s t r 4 =ab c ;c ons t c h ar *s t r 5 =ab c;c ons t c h ar *s t r 6 二 ab c;c h ar *s t r 7=ab c;c h ar *s t r 8 =ab c”;c ou t (c ou t (c ou t (c ou t (s t r l=s t r 2 )e nd l;s t r
20、3 =s t r 4 )e nd l;s t r 5 =s t r 6)e nd l;s t r 7=s t r 8 )e nd l;结果是:0 0 11解答:s t r l,s t r 2,s t r 3,s t r 4是数组变量,它们有各自的内存空间;而s t r 5,s t r 6,s t r 7,s t r 8是指针,它们指向相同的常量区域。1 2.以下代码中的两个s i z e of用法有问题吗?C易voi d Uppe r c as e(c h ar s t r )/将s t r中的小写字母转换成大写字母f or(s i z e t i=0;i i f (a=s t r i&s t
21、 r i=,z)s t r i -=(a,A);)c h ar s t r =aB c D e;c ou t s t r 字符长度为:“s i z e of (s t r)/s i z e of (s t r 0)e nd l;Uppe r c as e(s t r );c ou t s t r (Y)?(Y):(X)结尾没有;2、嵌入式系统中经常要用到无限循环,你怎么用C 编写死循环。w hil e(1)。或者 f o r (;)3、关键字s t a t ic 的作用是什么?定义静态变量4、关键字c o n s t 有什么含意?表示常量不可以修改的变量。5、关键字v o l a t il e
22、 有什么含意?并举出三个不同的例子?提示编译器对象的值可能在编译器未监测到的情况下改变。in t (*s 1 0)(in t)表示的是什么啊in t (*s 1 0)(in t)函数指针数组,每个指针指向个in t f u n c(in t p a r a m)的函数。1.有以下表达式:in t a=2 4 8;b=4;in t c o n s t c-21;c o n s t in t *d=&a;in t c o n s t e=&b;in t c o n s t *f c o n s t =&a;请问下列表达式哪些会被编译器禁止?为什么?*c=3 2;d=&b;*d=4 3;e=3 4;
23、e=&a;f=0 x 3 2 1 f;*c这是个什么东东,禁止*d说了是c o n s t,禁止e =&a说了是c o n s t 禁止c o n s t *f c o n s t =&a;禁止2.交换两个变量的值,不使用第三个变量。即 a=3,b=5,交换之后a=5,b=3;有两种解法,一种用算术算法,一种用八(异或)a =a +b;b =a -b;a =a -b;o ra =a b;只能对 in t,c ha r.b =a b;a =a b;o ra =b a;3.c和c+中的struct有什么不同?c和c+中struct的主要区别是c中的struct不可以含有成员函数,而C+中的stru
24、ct可以。C+中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private4.tfincludettincludevoid getmemory(char*p)(p=(char*)malloc(100);strcpy(p,hello world);)int main()char*str=NULL;getmemory(str);printf(%s/n”,s tr);free(str);return 0;)程序崩溃,getmemory中的malloc不能返回动态内存,free()对s tr操作很危险5.char szstr10;strc
25、py(szstr,”0123456789);产生什么结果?为什么?长度不一样,会造成非法的O S6.列举几种进程的同步机制,并比较其优缺点。原子操作信号量机制自旋锁管程,会合,分布式系统7.进程之间通信的途径共享存储系统消息传递系统管道:以文件系统为基础11.进程死锁的原因资源竞争及进程推进顺序非法12.死锁的4个必要条件互斥、请求保持、不可剥夺、环路13.死锁的处理鸵鸟策略、预防策略、避免策略、检测与解除死锁1 5.操作系统中进程调度策略有哪几种?FCFS(先来先服务),优先级,时间片轮转,多级反馈8 .类的静态成员和非静态成员有何区别?类的静态成员每个类只有一个,非静态成员每个对象一个9
26、.纯虚函数如何定义?使用时应注意什么?v ir t u al v o id f()=0;是接口,子类必须要实现1 0 .数组和链表的区别数组:数据顺序存储,固定大小连表:数据可以随机存储,大小可动态改变1 2.I S O 的七层模型是什么?t cp/u dp 是属于哪一层?t cp/u dp 有何优缺点?应用层表示层会话层运输层网络层物理链路层物理层t cp /u dp 属于运输层T C P 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。与 T C P 不同,U D P 并不提供对I P 协议的可靠机制、流控制以及错误恢复功能等。由于 U D P 比较简单,U D P
27、头包含很少的字节,比 T C P 负载消耗少。t cp:提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好u dp:不提供稳定的服务,包头小,开销小1:(v o id*)p t r 和(*(v o id*)p t r 的结果是否相同?其中p t r 为同一个指针.(v o id*)p t r 和(*(v o id*)p t r 值是相同的2:in t main()(in t x=3;pri ntf x);r et u r n 1;)问函数既然不会被其它函数调用,为什么要返回1?mian 中,c 标准认为0表示成功,非 0 表示错误。具体的值是某中具体出错信息1,要对绝对地址0 x 1 0
28、 0 0 0 0 赋值,我们可以用(u n s ign ed in t*)0 x 10 0 0 0 0 =1234;那么要是想让程序跳转到绝对地址是0 x 10 0 0 0 0 去执行,应该怎么做?*(v o id (*)()0 x 10 0 0 0 0 )();首先要将0 x 10 0 0 0 0 强制转换成函数指针,即:(v o id (*)0)0 x 10 0 0 0 0然后再调用它:*(v o id (*)()0 x 10 0 0 0 0)();用 t y p ed ef可以看得更直观些:t y p ed ef v o id(*)()v o id Fu n c Pt r;*(v o i
29、d Fu n c Pt r)0 x 10 0 0 0 0)();2,已知一个数组t a b le,用一个宏定义,求出数据的元素个数it d efin e N T B Lt t d efin e N T B L (s iz eo f(t a b le)/s iz eo f(t a b le0 )面试题:线程与进程的区别和联系?线程是否具有相同的堆栈?d ll是否有独立的堆栈?进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。每个线程有自己的堆栈。1)11中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为D L L
30、中的代码是被某些线程所执行,只有线程拥有堆栈,如果D L L 中的代码是E X E 中的线程所调用,那么这个时候是不是说这个D L L 没有自己独立的堆栈?如果D L L 中的代码是由D L L 自己创建的线程所执行,那么是不是说D L L 有独立的堆栈?以上讲的是堆栈,如果对于堆来说,每个D L L 有自己的堆,所以如果是从D L L 中动态分配的内存,最好是从D L L 中删除,如果你从D L L 中分配内存,然后在E X E 中,或者另外一个D L L 中删除,很有可能导致程序崩溃u n s ign ed s ho r t A =10;p r in t f(A =%u n ,A);c h
31、a r c=128;p r in t f(c=%d n”,c);输出多少?并分析过程第一题,A =0 x fffffff5,in t 值 为-11,但输出的是u in t。所以输出4 29 4 9 6 7 28 5第二题,c=0 x l0,输出的是in t,最高位为1,是负数,所以它的值就是0 x 0 0 的补码就是128,所以输出一 128。这两道题都是在考察二进制向in t 或 u in t 转换时的最高位处理。分析下面的程序:v o id Get M em o r y(c ha r *p,in t n u m)*p=(c ha r *)m a llo c(n u m);in t m a
32、in ()(c ha r *s t r=N U L L;Get M em o r y(&s t r,10 0);s t r c p y(s t r,hello );fr ee(s t r);if(s t r!=N U L L)(s t r c p y(s t r,w o r ld );p r in t f(,z n s t r is%s”,s t r);get c ha r 0;间输出结果是什么?希望大家能说说原因,先谢谢了输出 s tr i s w o r l d。f r e e 只是释放的s tr 指向的内存空间,它本身的值还是存在的.所以f r e e 之后,有一个好的习惯就是将s tr
33、=N U L L.此 时 s tr 指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,尽管这段程序确实是存在大大的问题(上面各位一经说得很清楚了),但是通常会打印出w o r l d 来。这是因为,进程中的内存管理般不是由操作系统完成的,而是由库函数自己完成的。当你m a l l o c 一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不
34、过。楼上都说过了,最好别这么干。c ha r a 1 0 ,s tr l e n(a)为什么等于1 5?运行的结果#i n c l u d e s td i o.h#i n c l u d e s tr i n g.hv o i d m a i n O(c ha r a a 1 0 ;p r i n tf(%d ,s tr l e n(a a);)s i z e o f ()和初不初始化,没有关系;s tr l e n()和初始化有关。c ha r (*s tr)2 0 ;/*s tr 是个数组指针,即指向数组的指针.*/c ha r *s tr 2 0 ;/*s tr 是一个指针数组,其元素
35、为指针型数据.*/l o n g a=0 x 80 1 0 1 0;a+5=?0 x 80 1 0 1 0 用二进制表示为:“1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0,十进制的值为83 92 72 0,再加 h 5 就是 83 92 72 5 罗1)给定结构s tr u c t A(c ha r t:4;c ha r k:4;u n s i g n e d s ho r t i:8;u n s i g n e d l o n g m;问 s i z e o f(A)=?给定结构s tr u c t A(c ha r t:4;4 位c ha
36、r k:4;4 位u n s i g n e d s ho r t i:8;8 位u n s i g n e d l o n g m;/偏移2字节保证4 字节对齐;共 8 字节2)下面的函数实现在一个数上加一个数,有什么错误?请改正。i n t a d d _ n (i n t n )(s ta ti c i n t i =1 0 0;i +=n;r e tu r n i;当你第二次调用时得不到正确的结果,难道你写个函数就是为了调用一次?问题就出在s ta ti c 上?/帮忙分析一下#i n c l u d e#i n c l u d e#i n c l u d e#i n c l u d
37、e#i n c l u d e#i n c l u d ety p e d e f s tr u c t A A(i n t b l:5;in t b 2:2;A A;v o id m a in()(A A a a;c ha r c c 100;s t r c p y(c c,01234 5 6 78 9 a b c d e f ghijkl m n o p q r s t u v w x y z);m e m c p y(&a a,c c,s iz e o f(A A);c o u t a a.b l c o u t a a.b 2 0&b 0&(*c a|*c b);)分析:s t r u
38、 c t b it in t a:3;in t b:2;in t c:3;;in t m a in()(b it s;c ha r *c=(c ha r*)&s;c o u t *c=0 x 9 9;c o u t s.a in t a=-l;pri ntfa);r e t u r n 0;输出为什么是41-1-4f f f f f f f f因为 0 x 9 9 在内存中表示为 100 11 001,a =001,b =11,c =100当 c为有符合数时,c =100,最 高 1 为表示c为负数,负数在计算机用补码表示,所以 c=-4;同理b =T;当 c为有符合数时,c =100,即 c
39、 =4,同 理 b =3位 域:有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0 和 1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称 为“位域”或“位段”。所 谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:s t r u c t 位域结构名位域列表);其中位域列表的形式为:类型说明符位域名:位域长度
40、例如:s tr u c t b s(in t a:8;in t b:2;in t c:6;;位域变量的说明与结构变量说明的方式相同。可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:s tr u c t b s(in t a:8;in t b:2;in t c:6;d a ta;说明d a ta 为 b s 变量,共占两个字节。其中位域a占 8 位,位域b占 2 位,位域c占6 位。对于位域的定义尚有以下几点说明:1 .一个位域必须存储在同个字节中,不能跨两个字节。如-个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:s tr u
41、c t b s(u n s ig n e d a:4u n s ig n e d :0 /*空域*/u n s ig n e d b:4 /*从下一单元开始存放*/u n s ig n e d c:4)在这个位域定义中,a占第一字节的4 位,后 4位填0表示不使用,b 从第二字节开始,占用4位,c占用4 位。2 .由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8 位二进位。3 .位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:s tr u c t kin t a:1in t:2 /*该 2 位不能使用*/in t b:3in t
42、c:2);从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。二、位域的使用位域的使用和结构成员的使用相同,其一般形式为:位域变量名 2 2 6;位域名位域允许用各种格式输出。ma in O s tr u c t b s(u n s ig n e d a:1;u n s ig n e d b:3;u n s ig n e d c:4;b it,*p b it;b it.a=l;b it.b=7;b it.c=1 5;p r i改错:#in c lu d ein t ma in(v o id)in t*p;in t a r r 1 0 0 ;p =&a r r;r
43、 e tu r n 0;)解答:搞错了,是指针类型不同,in t*p;二级指针&a r r;/得到的是指向第一维为1 0 0的数组的指针#in c lu d ein t ma in(v o id)in t*p,*q;in t a r r 1 0 0 ;q =a r r;P =&q;r e tu r n 0;下面这个程序执行后会有什么错误或者效果:#d e f in e M A X 2 55in t ma in()(u n s ig n e d c ha r A M A X ,i;i 被定义为 u n s ig n e d c ha rf o r (i=0;i=M A X;i+)A i=i;)解
44、答:死循环加数组越界访问(C/C+不进行数组越界检查)M A X=2 55数组A的下标范围为:0 M A X-1,这是其一.其二.当i循环到2 55时,循环内执行:A 2 55=2 55;这句本身没有问题.但是返回f o r (i=0;i=M A X)(M A X =2 *M A X;b=(int*)rea l l oc(a,M A X *sizeof(int);if(b=N U L L)(print f(z,error3,z);ex it(-1);)a =b;)for(1j =0;)fprint f(fp2,z/%d n/z,a j);fcl ose(fpl);fcl ose(fp2);re
45、t urn 0;)第二题.#incl udeint ma in(void)(unsigned l ong int i,j,k;print f(,zpl ea se input t he nuniber n);sca nf(cT,&i);if(i%2 =0)j=i/2;el sej=i/2 +1;print f(T he resul t is n);for(k=0;k j;k+)print f(z,%d=%d+%d n,z,i,k,i-k);ret urn 0;)#incl udevoid ma in()(unsigned l ong int a,i=l;sca nf(cT,&a);if(a%2
46、=0)(for(i=l;i p r i n tf a,a-i);el sefor(i=l;i=a/2;i+)print f(z/%d,%d,z,i,a-i);)兄弟,这样的题目若是做不出来实在是有些不应该,给你个递规反向输出字符串的例子,可谓是反序的经典例程.void inverse(cha r*p)(if(*p 二二 0)ret urn;inverse(p+1);print f(%c,*p);int ma in(int a rgc,cha r*a rgv )(inverse(/a bc 0,/);ret urn 0;)借签了楼上的“递规反向输出”#i n c l u d ev o i d t
47、 es t(FI L E*fr ea d,FI L E*fw r i t e)(c h a r b u f1024=0;i f(!fg et s(b u f,s i z eo f(b u f),fr ea d)r et u r n;t es t(fr ea d,fw r i t e);fp u t s(b u f,fw r i t e);)i n t m a i n(i n t a r g c,c h a r *a r g v)(FI L E*fr =N U L L;FI L E*fw =N U L L;fr =fo p en(,zd a t az,,“r b);fw =fo p en(,/d
48、 a t a o u t,/,w b );t es t(fr,fw);fc l o s e(fr);fc l o s e(fw);r et u r n 0;)在对齐为4 的情况下s t r u c t B B B(l o n g n u m;c h a r *n a m e;s h o r t i n t d a t a;c h a r h a;s h o r t b a 5;*P;p=0 x l 000000;p+0 x 200=_ _ _ _;(U l o n g)p+0 x 200=_ _ _ _;(c h a r*)p+0 x 200=_ _ _ _;希望各位达人给出答案和原因,谢谢拉
49、解答:假设在32位 CP U 上,s i z eo f(l o n g)=4 b y t ess i z eo f(c h a r *)=4 b y t ess i z eo f(s h o r t i n t)=s i z eo f(s h o r t)=2 b y t ess i z eo f(c h a r)=1 b y t es由于是4 字节对齐,s i z eo f(s t r u c t B B B)=s i z eo f(*p)=4 +4+2+1 +1/*补齐*/+2*5+2/*补齐*/=24 b y t es (经 Dev-C+验证)p=0 x 1000000;p+0 x 20
50、0=_ _ _ _;=0 x 1000000+0 x 200*24(U l o n g)p+0 x 200二=0 x 1000000+0 x 200(c h a r*)p+0 x 200=_ _ _ _;=0 x 1000000+0 x 200*4你可以参考一下指针运算的细节写一段程序,找出数组中第k 大小的数,输出数所在的位置。例如 2,4,3,4,7)中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3 随便输出哪一个均可。函数接口为:i n t fi n d _ o r d er k (c o n s t i n t*n a r r y,c o n s t i n t n