2010201020102010CCCC、C++C++C++C++笔试题大全,被问的概率几乎100%100%100%100%。很少有真正精通了C语言编程的学员,一般都有或多或少概念不是完全清楚的问题,特别是一些需要丰富的实战经验才能体会和明白的问题,如字符串,指针,类型转换,定义指向函数的指针类型,这也是导致学习C困难的一个原因。下面有几个简单测试将能发现你对C语言的掌握情况。1)intx=35;charstr[10];//问:strlen(str)和sizeof(str)的值分别是多少?答:strlen(str)值不确定,strlen根据'\0'确定字符串是否结束。sizeof(str)=10sizeof一个数组为数组长度strcpy(str,*共13个字母*/);//问:此时x和strlen(str)的值分别是多少?答:x为35strcpy(char*dest,constchar*src)根据src来复制dest,依照src的'\0'决定复制的长度,而dest必须要提供足够的长度,这里会引起溢出,strlen返回13,但是数组外部的数据已经被破坏strlen的值为13,在VC++环境下,x的值是要改变的(其他编译器下没试,).虽然表面上看来,在程序中并没有修改x的值,但是实际运行的结果是上面的x的值发生了修改,这是因为strcpy以后,把多余的数据拷贝进了str的邻居(int类型的x)中,所以x的数据也就变了.这是一个曾让我刻骨铭心的问题,在我刚出道时遇到这个问题,虽然在朋友的帮助下解决了这个问题,但一直不明白x的值为何变了,只有最后走上培训教师的岗位,才开始梳理自己曾经的困惑,才开始总结以前的经验供学员们借鉴.我觉得这个题目的价值非常之大,它能引起学员对字符串拷贝越界问题的足够重视,并且通过这个问题更能明白字符串的处理是怎么回时,更能明白字符串与字符数组的关系:字符串就是一个字符数组,只是把这个字符数组用在处理串的函数中时,这些函数不考虑数组的长度,只是记住数组的首地址,从首地址开始处理,并在遇到0时结束处理,3)charstr[10];str=it315.org;//alsocanuse:memcpy(str,it315.org)//编译能通过吗?答:数组不能赋值,只能初始化。charstr[10]=it315.org;而且初始化时编译器会检查数组的长度与初始化串的长度是否匹配4)char*pstr;strcpy(pstr,);//需要初始化并分配空间//上句编译能通过吗?运行时有问题吗?答:可以通过编译,但是pstr指向了常量区,运行时最好只做读操作,写操作不保险。编译可以通过,但是pstr没有进行有效的初始化,它指向了一个不确定的内存区,运行时会出现内存不可写错误!constchar*p1;char*constp2;//const指针必须初始化//上面两句有什么区别吗?答:constchar*和charconst*一样,都是表示指向常量的字符指针。char*const表示指向字符的常量指针p1=(constchar*)str;//如果是p1=str;编译能够通过吗?明白为什么要类型转换?类型转换的本质是什么?答:可以通过编译。关于常量与非常量指针的关系是这样的:const指针可以指向const或者非const区域,不会造成什么问题。非const指针不能指向const区域,会引起错误。(呵呵,这个问题,很经典)strcpy(p1,abc);//编译能够通过吗?答:不能通过,strcpy(char*,constchar*);char*不能指向constchar*注意:非const指针不能指向const区域,会引起错误。printf(%d,str);//有问题吗?答:没有问题,输出的是str的地址信息Char*pstr;pstr=3000;//编译能过吗?如果不行,该如何修改以保证编译通过呢?答:不能通过,char*pstr表示pstr是个字符指针,不能指向3000的整形变量。修改的话,可以这样:pstr=(char*)3000,把pstr指向3000这个地址;longy=(long)pstr;//可以这样做吗?答:可以,y的值为pstr所指的地址。不过如果是纯粹要地址的话,最好是用unsignedlong。int*p=str;*p=0x00313200;printf(%s,str);//会是什么效果?提示0x31对应字符'1',0x32对应字符'2'。答:首先编译未必会过关,有些编译器可能不允许int*直接指向char*。最好是改为int*p=(int*)str;过关了效果就是什么东西都没有。int*p=str;p为str所指的地址,*p表示修改了str所指向的内存。由于sizeof(int)在32位机上,int有4个字节(其实具体要看编译器的配置文件,好像是limit.h,一般是4个字节)所以修改了str[0]-str[3]由于0x00313200头尾都是0,所以字符串为'\0'开头,什么都打印不出来。这里有个Big-endin和little-endin的问题。以0x31323334为例little-endin的机器上面,0x31323334在内存中排列顺序为34333231,输出为4321,如INTEL芯片的pcbig-endin机器上面为31323334,输出为1234,如IBMPOWERPCp=3000;//p+1的结果会是多少?答:3000+sizeof(int);指针+1均为原来地址加上sizeof(指针所指的数据类型)char*pc=newchar[100];//上述语句在内存中占据几个内存块,怎样的布局情况?答:本身pc会占用函数栈一个4字节的指针长度(具体是否为4个字节要看机器和编译器)。new会在堆上申请100个字节sizeof(char)的连续空间。voidtest(char**p){*p=newchar[100];}//这个编译函数有问题吗?外面要调用这个函数,该怎样传递参数?答:该程序没有问题。需要在函数中对指针所指的地址进行变化是必须传入指针的地址。原因是这样的:如果传入的为指针本身,在函数调用的时候,实参会被复制一个实例,这样就不是原来的指针了,对该指针本身进行的任何改变都不能传递回去了。可以这样理解,如果传入的参数为int,那么对int本身的值的改变就传不回去啦,加个*也是一样的。//能明白typedefint(*PFUN)(intx,inty)及其作用吗?答:定义了一个函数指针类型的宏,这样PFUN就表示指向返回值为int,且同时带2个int参数的函数指针类型了。可以用来定义这样的变量:比如有个函数为intfun(intx,inty);PFUNp=fun;补充::函数指针最大的用处在于它可以被一个模板方法调用,这是我在学java的设计模式时领悟到的.例如,有两个函数的流程结构完全一致,只是内部调用的具体函数不同,如下所示:voidfunc1(){//一段流程代码和面向方面的代理,如安全检查,日志记录等intsum=add(x,y);//一段流程代码和面向方面的代理,如安全检查,日志记录等}voidfunc2(){//与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等intdifference=sub(x,y);//与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等}那么,可以只定义一个函数,如下所示voidfunc(PFUNCp){//与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等intdifference=p(x,y);//与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等}调用程序在调用时,让参数p分别指向add和sub函数就可以了.以下是腾讯的笔试面试题:]请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句2、如何输出源文件的标题和目前执行行的行数3、两个数相乘,小数点后位数没有限制,请写一个高精度算法4、写一个病毒5、有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内这四个人都过桥?2008年腾讯招聘选择题(60)c/c++oslinux方面的基础知识c的Sizeof函数有好几个!程序填空(40)1.(20)4空x5不使用额外空间,将A,B两链表的元素交叉归并2.(20)4空x5MFC将树序列化转存在数组或链表中!1,计算a^b2(运算符优先级问题)2根据先序中序求后序3a[3][4]哪个不能表示a[1][1]:*(&a[0][0])*(*(a+1)+1)*(&a[1]+1)*(&a[0][0]+4)4for(inti...)for(intj...)printf(i,j);printf(j)会出现什么问题5for(i=0;i10;++i,sum+=i);的运行结果610个数顺序插入查找二叉树,元素62的比较次数710个数放入模10hash链表,最大长度是多少8fun((exp1,exp2),(exp3,exp4,exp5))有几个实参9希尔冒泡快速插入哪个平均速度最快10二分查找是顺序存储链存储按value有序中的哪些11顺序查找的平均时间12*p=NULL*p=newchar[100]sizeof(p)各为多少13频繁的插入删除操作使用什么结构比较合适,链表还是数组14enum的声明方式151-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少大题:1把字符串转换为小写,不成功返回NULL,成功返回新串char*toLower(char*sSrcStr){char*sDest=NULL;if(__1___){intj;sLen=strlen(sSrcStr);sDest=new[_______2_____];if(*sDest==NULL)returnNULL;sDest[sLen]='\0';while(_____3____)sDest[sLen]=toLowerChar(sSrcStr[sLen]);}returnsDest;}2把字符串转换为整数例如:-123--123main(){.....if(*string=='-')n=____1______;elsen=num(string);.....}intnum(char*string){for(;!(*string==0);string++){intk;k=__2_____;j=--sLen;while(__3__)k=k*10;num=num+k;}returnnum;}附加题:1linux下调试core的命令,察看堆栈状态命令2写出socks套接字服务端客户端通讯程序3填空补全程序,按照我的理解是添入:win32调入dll的函数名查找函数入口的函数名找到函数的调用形式把formView加到singledoc的声明将singledoc加到app的声明4有关系s(sno,sname)c(cno,cname)sc(sno,cno,grade)1问上课程db的学生no2成绩最高的学生号3每科大于90分的人数主要是c/c++、数据结构、操作系统等方面的基础知识。好像有sizeof、树等选择题。填空题是补充完整程序。附加题有写算法的、编程的、数据库sql语句查询的。还有一张开放性问题。请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句#defineMax(a,b)(a/b)?a:b如何输出源文件的标题和目前执行行的行数intline=__LINE__;char*file=__FILE__;coutfilenameis(file),lineislineendl;两个数相乘,小数点后位数没有限制,请写一个