c、c笔试题,面试题.pdf
《c、c笔试题,面试题.pdf》由会员分享,可在线阅读,更多相关《c、c笔试题,面试题.pdf(98页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C、C+笔试题,面试题很少有真正精通了C语言编程的学员,一般都有或多或少概念不是完全清楚的问题,特别是一些需要丰富的实战经验才能体会和明白的问题,如字符串,指针,类型转换,定义指向函数的指针类型,这也是导致学习C困难的一个原因。下面有几个简单测试招能发现你 对 C语言的掌握情况。1)int x=3 5;char str 1 0 ;/问:strlen(str)和 siz eof(str)的值分别是多少?答:strlen(str)值不确定,strlen根据 0 确定字符串是否结束。siz eof(str)=1 0 siz eof 一 个数组为数组长度strcpy (str,it3 1 5.org”
2、/*共 1 3 个字母*/);问:此 时 x 和 strlen(str)的值分别是多少?答:x 为 3 5strcpy(char*dest,const char*src)根 据 src来复制dest,依 照 src的 0 决定复制的长度,而dest必须要提供足够的长度,这里会引起溢出,strlen返 回 1 3,但是数组外部的数据己经被破坏strlen的值为1 3,在 V C+环境下,x 的值是要改变的(其他编译器下没试,).虽然表面上看来,在程序中并没有修改x 的值,但是实际运行的结果是上面的x 的值发生了修改,这是因 为 strcpy 以后,把多余的数据拷贝进了 str的邻居(int类型的
3、x)中,所 以 x 的数据也就变了.这是一个曾让我刻骨铭心的问题,在我刚出道时遇到这个问题,虽然在朋友的帮助下解决了这个问题,但一直不明白x 的值为何变了,只有最后走上培训教师的岗位,才开始梳理自己曾经的困惑,才开始总结以前的经验供学员们借鉴.我觉得这个题目的价值非常之大,它能引起学员对字符串拷贝越界问题的足够重视,并且通过这个问题更能明白字符串的处理是怎么回时,更能明白字符串与字符数组的关系:字符串就是一个字符数组,只是把这个字符数组用在处理串的函数中时,这些函数不考虑数组的长度,只是记住数组的首地址,从首地址开始处理,并在遇到0时结束处理,3)char s t r 1 0;s t r=it
4、 31 5.o r g;/als o can u s e:m em cp y(s t r,“it 31 5.o r g)编译能通过吗?答:数组不能赋值,只能初始化。char s t r 1 0 =it 31 5.o r g;而且初始化时编译器会检查数组的长度与初始化串的长度是否匹配4)char *p s t r;s t r cp y (p s t r,,zit 31 5.o r g);需要初始化并分配空间上句编译能通过吗?运行时有问题吗?答:可以通过编译,但 是 p s t r 指向了常量区,运行时最好只做读操作,写操作不保险。编译可以通过,但是p s t r 没有进行有效的初始化,它指向了一
5、个不确定的内存区,运行时会出现内存不可写错误!co n s t char *p l;char *co n s t p 2;co n s t 指针必须初始化上面两句有什么区别吗?答:co n s t char*和 char co n s t*一样,都是表示指向常量的字符指针。char *co n s t 表示指向字符的常量指针p l=(co n s t char *)s t r;如果是p l=s t r;编译能够通过吗?明白为什么要类型转换?类型转换的本质是什么?答:可以通过编译。关于常量与非常量指针的关系是这样的:co n s t 指针可以指向co n s t 或者非co n s t 区域,不
6、会造成什么问题。非 co n s t 指针不能指向co n s t 区域,会引起错误。(呵呵,这个问题,很经典)s t r cp y (p l,abc);编译能够通过吗?答:不能通过,s t r cp y (char*,co n s t char*);char*不能指向 co n s t char*注意:非 co n s t 指针不能指向co n s t 区域,会引起错误。p r in t f(%d,s t r);有问题吗?答:没有问题,输出的是s t r 的地址信息C har *p s t r;p s t r=30 0 0;编译能过吗?如果不行,该如何修改以保证编译通过呢?答:不能通过,ch
7、ar*p s t r 表示p s t r 是个字符指针,不能指向30 0 0 的整形变量。修改的话,可以这样:p s t r =(char*)30 0 0,把 p s t r 指 向 30 0 0 这个地址;lo n g y=(lo n g)p s t r;可以这样做吗?答:可以,y的值为p s t r 所指的地址。不过如果是纯粹要地址的话,最好是用u n s ign ed lo n g。in t *p=s t r;*p=0 x 0 0 31 32 0 0;p r in t f(%s”,s t r);会是什么效果?提示0 x 31 对应字符 1 ,0 x 32 对应字符 2 。答:首先编译未必
8、会过关,有些编译器可能不允许in t *直接指向char*。最好是改为 in t *p =(in t*)s t r;过关了效果就是什么东西都没有。in t *p=s t r;p为 s t r 所指的地址,*p 表示修改了s t r 所指向的内存。由于s iz eo f(in t)在 32 位机上,in t 有 4个字节(其实具体要看编译器的配置文件,好像 是 lim it.h,一般 是 4个字节)所以修改了 s t r 0-str 3 由于0 x 0 0 3 13 2 0 0 头尾都是0,所以字符串为 0 开头,什么都打印不出来。这里有个B i g-en di n 和 l i ttl e-en
9、 di n 的问题。以 0 x 3 13 2 3 3 3 4 为例l i ttl e-en di n 的机器上面,0 x 3 13 2 3 3 3 4 在内存中排列顺序为3 4 3 3 3 2 3 1,输出为4 3 2 1,如 INTEL芯片的p cbi g-en di n 机器上面为 3 1 3 2 3 3 3 4 ,输出为 12 3 4,如 IB M POWERPCp=3 0 0 0;/p+l 的结果会是多少?答:3 0 0 0+si z eo f(i n t);指针+1均为原来地址加上si z eo f (指针所指的数据类型)ch ar*p c=n ew ch ar 10 0 ;上述语句
10、在内存中占据儿个内存块,怎样的布局情况?答:本身p c会占用函数栈一个4字节的指针长度(具体是否为4个字节要看机器和编译 器)。n ew 会在堆上申请10 0 个字节si z eo f (ch ar)的连续空间。v o i d test(ch ar*p)*p=n ew ch ar 10 0 ;/这个编译函数有问题吗?外面要调用这个函数,该怎样传递参数?答:该程序没有问题。需要在函数中对指针所指的地址进行变化是必须传入指针的地址。原因是这样的:如果传入的为指针本身,在函数调用的时候,实参会被复制一个实例,这样就不是原来的指针了,对该指针本身进行的任何改变都不能传递回去了。可以这样理解,如果传入的
11、参数为i n t,那么对i n t本身的值的改变就传不回去啦,加个*也是一样的。能明白ty p edef i n t(*PFUN)(i n t x,i n t y)及其作用吗?答:定义了一个函数指针类型的宏,这 样 PFUN就表示指向返回值为i n t,且同时带2个i n t参数的函数指针类型了。可以用来定义这样的变量:比如有个函数为i n t f u n(i n t x,i n t y ):PFUN p =f u n;补充:函数指针最大的用处在于它可以被一个模板方法调用,这是我在学j av a的设计模式日领悟到的.例如,有两个函数的流程结构完全一致,只是内部调用的具体函数不同,如下 所 示:
12、v o i d f u n d()(一段流程代码和面向方面的代理,如安全检查,日志记录等i n t s u m =a d d(x ,y);一段流程代码和面向方面的代理,如安全检查,日志记录等)v o i d f u n c 2()(与 f u n c l 完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等i n td i f f e r e n c e =s u b(x ,y);与 f u n c l 完全相同的段流程代码和面向方面的代理,如安全检查,日志记录等那么,可以只定义一个函数,如下所示v o i d f u n c(P FU N C p)/与fu n d完全相同的一段流程
13、代码和面向方面的代理,如安全检查,日志记录等intdifference=p(x,y);与funcl完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等调用程序在调用时,让参数p分别指向add和sub函数就可以了.以下是腾讯的笔试面试题:请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、i f语句2、如何输出源文件的标题和目前执行行的行数3、两个数相乘,小数点后位数没有限制,请写一个高精度算法4、写一个病毒5、有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内这
14、四个人都过桥?2008年腾讯招聘选择题(60)c/c+os linux方面的基础知识c的Sizeof函数有好几个!程序填空(40)1.(20)4 空 x5不使用额外空间,将A,B两链表的元素交叉归并2.(20)4 空 x5MFC将树序列化转存在数组或链表中!1,计 算a*b 2(运算符优先级问题)2根据先序中序求后序3 a3 4哪个不能表示 al 1:*(&a0 0)*(*(a+l)+l)*(&al+l)*(&a0 0+4)4 f o r(i n t i.)f o r(i n t j.)p r i n t f (i,j);p r i n t f (j)会由现什么问题5 f o r(i=0;i
15、-123main()if(*s t ring=)n=1;els en=nu m(s t ring);int nu m(c har*s t ring)for(;!(*s t ring=0);s t ring+)int k;k 二 _2;j=-s L en;w hile(_3_)k =k *10;nu m=nu m+k;ret u rn nu m;)附加题:1 linu x下调试c ore的命令,察看堆栈状态命令2 写 出 s oc k s 套接字服务端客户端通讯程序3 填空补全程序,按照我的理解是添入:W in32调 入 dll的函数名查找函数入口的函数名找到函数的调用形式把 formV iew
16、 加 到 s ingledoc 的声明 将 s ingledoc 加到app的声明4 有关系 s (s no,s name)c (eno,c name)s c (s no,eno,grade)1 问上课程曲的学生no2 成绩最高的学生号3 每科大于90 分的人数主要是C/C+、数据结构、操作系统等方面的基础知识。好像有s iz eof、树等选择题。填空题是补充完整程序。附加题有写算法的、编程的、数据库s q l语句查询的。还有一张开放性问题。请定义一个宏,比较两个数a、b 的大小,不能使用大于、小于、if语 句#defineM ax(a,b)(a/b)?a:b如何输出源文件的标题和目前执行行的
17、行数int line=L I N E;c har*file=_F I L E_;c ou t z file name is /z(file),z,line is line endl;两个数相乘,小数点后位数没有限制,请写一个高精度算法写一个病毒w h i l e (1)(i n t *p =n e w i n t 1 0 0 0 0 0 0 0 ;)不使用额外空间,将 A,B两链表的元素交叉归并将树序列化转存在数组或 链表中s t r u c t s t i n t i;s h o r t s;c h a r c;);s i z e o f (s t r u c t s t);8c h a r
18、 *p l;v o i d *p 2;i n t p 3;c h a r p 4 1 0 ;s i z e o f(p l.p 4)=?4,4,4,1 0二分查找快速排序双向链表的删除结点有 1 2 个小球,外形相同,其中一个小球的质量与其他1 1 个不同给一个天平,问如何用3次把这个小球找出来并且求出这个小球是比其他的轻还是重解答:哈哈,据说这是微软前几年的一个面试题。很经典滴啊!三次一定能求出来,而且能确定是重还是轻。数据结构的知识还没怎么学透,不过这个题我到是自己研究过,可以分析下。将 1 2 个球分别编号为 a l,a 2,a 3.a l O,a l l,a l 2.第一步:将 1 2
19、 球分开3拨,每 拨 4个,a l a 4 第一拨,记 为 b l,a 5 a 6 第 2拨,记为b 2,其余第3 拨,记为b 3;第二步:将 b l 和 b 2 放到天平两盘上,记左盘为c l,右 为 c 2;这时候分两中情况:l.c l 和 c 2 平衡,此时可以确定从a l 到 a 8 都是常球;然后把c 2 拿空,并从c l 上拿下a 4,从 a 9 到 a l 2 四球里随便取三球,假设为a 9 到 a l l,放 到 c2上。此 时 c l 上是a l 到a 3,c 2 上 是 a 9 到 a l l。从这里又分三种情况:A:天平平衡,很简单,说明没有放上去的a l 2 就是异球,
20、而到此步一共称了两次,所以将a l 2 随便跟1 1 个常球再称一次,也就是第三次,马上就可以确定a l 2 是重还是轻;B:若 c l 上升,则这次称说明异球为a 9 到 a l l 三球中的一个,而且是比常球重。取下c l 所有的球,并将a 8 放 到 c l 上,将 a 9 取下,比较a 8 和 a l l (第三次称),如果平衡则说明从c 2 上取下的a 9 是偏重异球,如果不平衡,则偏向哪盘则哪盘里放的就是偏重异球;C:若 c l 下降,说明a 9 到 a l l 里有一个是偏轻异球。次种情况和B类似,所以接下来的步骤照搬B就是;2.c l 和 c 2 不平衡,这时候又分两种情况,c
21、 l 上升和c l 下降,但是不管哪种情况都能说明a 9 到 a l 2 是常球。这步是解题的关键。也是这个题最妙的地方。A:cl卜 一 升,此时不能判断异球在哪盘也不能判断是轻还是重。取 下 c l 中的a 2 到 a 4 三球放一边,将 c 2 中的a 5 和 a 6 放 到 c l 上,然后将常球a 9 放 到 c 2 上。至此,c l 上是a l,a 5 和 a 6,c 2 上 是 a 7,a 8 和 a 9。此时又分三中情况:1)如果平衡,说明天平上所有的球都是常球,异球在从c l 上取下a 2 到 a 4 中。而且可以断定异球轻重。因为a 5 到 a 8 都是常球,而第2次称的时候
22、c l 是上升的,所 以 a 2 到 a 4里必然有一个轻球。那么第三次称就用来从a 2 到 a 4 中找到轻球。这很简单,随便拿两球放 到 c l 和 c 2,平衡则剩余的为要找球,不平衡则哪边低则哪个为要找球;2)c l 仍然保持上升,则说明要么a l 是要找的轻球,要 么 a 7 和 a 8 两球中有一个是重球(这步懂吧?好好想想,很简单的。因为a 9 是常球,而取下的a 2 到 a 4 肯定也是常球,还可以推出换盘放置的a 5 和 a 6也是常球。所以要么a l 轻,要 么 a 7 或 a 8 重)。至此,还剩一次称的机会。只需把a 7 和 a 8 放上两盘,平衡则说明a l 是要找的
23、偏轻异球,如果不平衡,则哪边高说明哪个是偏重异球;3)如果换球称第2次后天平平衡打破,并 且 c l 降低了,这说明异球肯定在换过来的a 5和 a 6两求中,并且异球偏重,否则天平要么平衡要么保持c l 上升。确定要找球是偏重之后,将 a 5 和 a 6放到两盘上称第3 次根据哪边高可以判定a 5 和 a 6哪个是重球;B:第 1 次称后c l 是下降的,此时可以将c l 看成c 2,其实以后的步骤都同A,所以就不必要再重复叙述了。至此,不管情况如何,用且只用三次就能称出1 2 个外观手感一模一样的小球中有质量不同于其他1 1 球的偏常的球。而且在称的过程中可以判定其是偏轻还是偏重。给一个奇数
24、阶N幻方,填入数字1,2,3.N*N,使得横竖斜方向上的和都相同答案:#i n c l u d e#i n c l u d e#i n c l u d e u si n g n a m e sp a c e st d;i n t m a i n Oi n t n;c i n n;i n t i;i n t *M a t r=n e w i n t*n ;动态分配二维数组f o r (i=0;i n;+i)M a t r i =n e w i n t n ;/动态分配二维数组/j=n/2 代表首行中间数作为起点,即 1 所在位置i n t j=n/2,n u m=l ;初始值i=0;wh i l
25、 e(n u m!=n*n+l)(往右上角延升,若超出则用%转移到左下角M a t r (i%n+n)%n (j%n+n)%n =n u m;斜行的长度和n是相等的,超出则转至下一斜行i f(n u m%n=0)i+;e l se(i ;j+;)n u m+;)f o r(i=0;i n;i+)f o r(j=0;j n;+j)coutsetw(int)loglO(n*n)+4)M atr i j ;格式控制 coutendlendl;/格式控制for(i=0;in;+i)delete Matr i;return 1;腾讯的一道面试题:(与百度相似,可惜昨天百度死在这方面了)/在 一 个 文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 笔试 试题
限制150内