c、c笔试题面试题

举报
资源描述
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”/*共 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类型的x)中,所 以 x 的数据也就变了.这是一个曾让我刻骨铭心的问题,在我刚出道时遇到这个问题,虽然在朋友的帮助下解决了这个问题,但一直不明白x 的值为何变了,只有最后走上培训教师的岗位,才开始梳理自己曾经的困惑,才开始总结以前的经验供学员们借鉴.我觉得这个题目的价值非常之大,它能引起学员对字符串拷贝越界问题的足够重视,并且通过这个问题更能明白字符串的处理是怎么回时,更能明白字符串与字符数组的关系:字符串就是一个字符数组,只是把这个字符数组用在处理串的函数中时,这些函数不考虑数组的长度,只是记住数组的首地址,从首地址开始处理,并在遇到0时结束处理,3)char s t r 1 0;s t r=it 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 没有进行有效的初始化,它指向了一个不确定的内存区,运行时会出现内存不可写错误!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 区域,不会造成什么问题。非 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;编译能过吗?如果不行,该如何修改以保证编译通过呢?答:不能通过,char*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 。答:首先编译未必会过关,有些编译器可能不允许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 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 ;上述语句在内存中占据儿个内存块,怎样的布局情况?答:本身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 ;/这个编译函数有问题吗?外面要调用这个函数,该怎样传递参数?答:该程序没有问题。需要在函数中对指针所指的地址进行变化是必须传入指针的地址。原因是这样的:如果传入的为指针本身,在函数调用的时候,实参会被复制一个实例,这样就不是原来的指针了,对该指针本身进行的任何改变都不能传递回去了。可以这样理解,如果传入的参数为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的设计模式日领悟到的.例如,有两个函数的流程结构完全一致,只是内部调用的具体函数不同,如下 所 示: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完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等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分钟内这四个人都过桥?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 -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 加 到 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如何输出源文件的标题和目前执行行的行数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两链表的元素交叉归并将
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关资源
正为您匹配相似的精品文档
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号