2022年c、c++笔试题,面试题 .pdf
《2022年c、c++笔试题,面试题 .pdf》由会员分享,可在线阅读,更多相关《2022年c、c++笔试题,面试题 .pdf(25页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、c、c+笔试题 , 面试题笔试, 面试, 职业规划 , 考研2010 C、C+ 笔试题大全,被问的概率几乎 100%。 、 笔试题大全,笔试题大全 。很少有真正精通了 C 语言编程的学员, 一般都有或多或少概念不是完全清楚的问题, 特别是一些需要丰富的实战经验才能体会和明白的问题,如字符串,指针,类型转换, 定义 指向函数的指针类型, 这也是导致学习 C 困难的一个原因。下面有几个简单测试将能发现你对 C 语言的掌握情况。1)int x=35; char str10; /问:strlen(str)和 sizeof(str)的值分别是多少?答:strlen(str) 值不确定, strlen 根
2、据0确定字符串是否结束。sizeof(str)=10 sizeof 一个数组为数组长度strcpy(str,www.it315.org/*共 13 个字母 */); / 问:此时x 和 strlen(str) 的值分别是多少?答:x 为 35 strcpy(char* dest, const char* src) 根据src 来复制dest, 依照src 的0决定复制的长度,dest 必须要提供足够的长度,这而 里会引起溢出,strlen 返回13,但是数组外部的数据已经被破坏strlen 的值为13,在 VC+ 环境下 ,x 的值是要改变的(其他编译器下没试 ,).虽然表面上看来, 在程序中
3、并没有修改x 的值 ,但是实际运行的结果是上面的 x 的值发生了修改,这是因为strcpy 以后 ,把多余的数据拷贝进了str 的邻居 (int 类型的x)中,所以x 的数据也就变了.这是一个曾让我刻骨铭心的问题,在我刚出道时遇到这个问题,虽然在朋友的帮助下解决了这个问题, 但一直不明白x 的值为何变了 ,只有最后走上培训教师的岗位 ,才开始梳理自己曾经的困惑, 才开始总结以前的经验供学员们借鉴.我觉得这个 题目的价值非常之大,它能引起学员对字符串拷贝越界问题的足够重视,并且通过这个问题更能明白字符串的处理是怎么回时,更能明白字符串与字符数组的关系:字符串就是一个字符数组 ,只是把这个字符数组
4、用在处理串的函数中时 ,这些函数不考虑数组的长度,只是记住数组的首地址 ,从首地址开始处理,并在遇到0 时 结束处理 , 3)char str10; str=it315.org; / also can use :memcpy(str, it315.org) /编译能通过吗?答:数组不能赋值,只能初始化。char str10 = it315.org; 而且初始化时编译器会检查数组的长度与初始化串的长度是否匹配4)char *pstr; strcpy(pstr,http:/www.it315.org); /需要初始化并分配空间/ 上句编译能通过吗?运行时有问题吗?答:可以通过编译,但是pstr 指
5、向了常量区,运行时最好只做读操作,写操作不保险。编译可以通过,但是pstr 没有进行有效的初始化,它指向了一个不确定的内存区,运行时会出现内存不可写错误! const char *p1; char * const p2; /const 指针必须初始化/ 上面两句有什么区别吗?答:const char* 和 char const* 一样,都是表示指向常量的字符指针。char * const 表示指向字符的常量指针p1=(const char *)str; / 如果是p1=str; 编译能够通过吗?明白为什么要类型转换?类型转换的本质是什么?答:可以通过编译。关于常量与非常量指针的关系是这样的:c
6、onst 指针可以指向const 或者非const 区域,不会造成什么问题。非 const 指针不能指向const 区域,会引起错误。(呵呵,这个问题,很经典 ) strcpy(p1,abc);/ 编译能够通过吗?答: 不能通过,strcpy( char*, const char*); char* 不能指向const char* 注意:非 const 指针不能指向const 区域,会引起错误。printf(%d,str);/有问题吗?答:没有问题,输出的是str 的地址信息Char *pstr; pstr=3000;/编译能过吗?如果名师资料总结 - - -精品资料欢迎下载 - - - - -
7、 - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 25 页 - - - - - - - - - 不行,该如何修改以保证编译通过呢?答:不能通过, char* pstr 表示pstr 是个字符指针, 不能指向3000 的整形变量。修改的话,可以这样:pstr = (char*)3000 ,把pstr 指向3000 这个地址 ; long y=(long)pstr;/ 可以这样做吗?答: 可以,y 的值为pstr 所指的地址。 不过如果是纯粹要地址的话,最好是用unsigned long。int *p=str; *p=0 x003132
8、00; printf(%s,str);/会是什么效果?提示0 x31 对应字符1,0 x32 对应字符 2。答:首先编译未必会过关,有些编译器可能不允许int * 直接指向char* 。最好是改为 int *p = (int*)str; 过关了效果就是什么东西都没有。int *p=str; p 为 str 所指的地址, *p 表示修改了str 所指向的内存。由于sizeof(int)在 32 位机上,有 4 个字节int (其实具体要看编译器的配置文件,好像是limit.h , 一般是4 个字节)所以修改了str0-str3 由于0 x00313200 头尾都是0, 所以字符串为0 开头,什么
9、都打印不出来。这里有个Big-endin 和little-endin 的 问 题 。 以0 x31323334 为 例little-endin 的 机 器 上 面 ,0 x31323334 在内存中排列顺序为34 33 32 31,输出为4321,INTEL 如芯片的pc big-endin 机器上面为31 32 33 34 ,输出为1234,如 IBM POWERPC p=3000;/p+1 的结果会是多少?答: 3000+sizeof(int); 指针 +1 均为原来地址加上sizeof(指针所指的数据类型) char *pc=new char100;/ 上述语句在内存中占据几个内存块,怎
10、样的布局情况?答: 本身pc 会占用函数栈一个4 字节的指针长度(具体是否为4 个字节要看机器和编译器)。 new 会 在 堆 上 申 请100 个 字 节sizeof(char) 的 连 续 空 间 。void test(char *p) *p=new char100; / 这个编译函数有问题吗?外面要调用这个函数,该怎样传递参数?答:该程序没有问题。需要在函数中对指针所指的地址进行变化是必须传入指针的地址。 原因是这样的: 如果传入的为指针本身,在函数调用的时候,实参会被复制一个实例,这 样就不是原来的指针了,对该指针本身进行的任何改变都不能传递回去了。可以这样理解, 如果传入的参数为in
11、t, 那么对int 本身的值的改变就传不回去啦,加个 * 也是一样的。/ 能明白typedef int (*PFUN)(int x,int y) 及其作用吗?答:定义了一个函数指针类型的宏,这样PFUN 就表示指向返回值为int,且同时带2 个 int 参数的函数指针类型了。可以用来定义这样的变量:比如有个函数为int fun( int x, int y ); PFUN p = fun; 补充: :函数指针最大的用处在于它可以被一个模板方法调用,这是我在学java 的设计模式时领悟到的 .例如 ,有两个函数的流程结构完全一致,只是内部调用的具体函数不同 ,如下所示 : void func1()
12、 / 一段流程代码和面向方面的代理,如安全检查 ,日志记录等int sum = add( x , y); / 一段流程代码和面向方面的代理,如安全检查 ,日志记录等 void func2() / 与 func1 完全相同的一段流程代码和面向方面的代理,如安全检查 ,日志记录等 int difference = sub( x , y); / 与 func1 完全相同的一段流程代码和面向方面的代理,如安全检查 ,日志记录等 那么 ,可以只定义一个函数,如下所示void func(PFUNC p) / 与 func1 完全相同的一段流程代码和面向方面的代理,如安全检查 ,日志记录等int diffe
13、rence = p( x , y); / 与 func1 完全相同的一段流程代码和面向方面的代理,如安全检查 ,日志记录等 调用程序在调用时 ,让参数p 分别指向add 和 sub 函数就可以了 . 以下是腾讯的 笔试面试 题: 请定义一个宏,比较两个数a、b 的大小,不能使用大于、小于、if 语句2、如何输出源文件的标题和目前执行行的行数3、两个数相乘, 小数点后位数没有限制,请写一个高精度算法4、写一个病毒5、有 A、B、C、D 四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、 2、5、10 分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17 分钟内这四
14、个人都过桥?名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 25 页 - - - - - - - - - 2008 年腾讯招聘选择题 (60) c/c+ os linux 方面的基础知识c 的 Sizeof 函数有好几个! 程序填空 (40) 1.(20) 4 空 x5 不使用额外空间,将 A,B 两链表的元素交叉归并2.(20) 4 空 x5 MFC 将树序列化转存在数组或链表中 ! 1, 计算 ab 2 (运算符优先级问题) 2 根据先序中序求后序3 a34 哪个不能
15、表示a11: *(&a00) *(*(a+1)+1) *(&a1+1) *(&a00+4) 4 for(int i.) for(int j.) printf(i,j); printf(j) 会出现什么问题5 for(i=0;i -123 main() . if( *string = - ) n = _1_; else n = num(string); . int num(char* string) for(;!(*string=0); string+) int k; k = _2_; j = -sLen; while( _3_) k = k * 10; num = num + k; retur
16、n num; 附加题:1 linux 下调试core 的命令,察看堆栈状态命令名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 25 页 - - - - - - - - - 2 写出socks 套接字服务端客户端通讯程序3 填空补全程序,按照我的理解是添入:win32 调入dll 的函数名查找函数入口的函数名找到函数的调用形式把 formView 加到singledoc 的声明将singledoc 加到app 的声明4 1 2 3 有关系s(sno,sname) c(cno
17、,cname) sc(sno,cno,grade) 问上课程db 的学生no 成绩最高的学生号每科大于90 分的人数主要是c/c+、数据结构、操作系统等方面的基础知识。好像有sizeof、树等选择题。填空题是补充完整程序。附加题有写算法的、编程的、数据库sql 语句查询的。还有一张开放性问题。请定义一个宏, 比较两个数a、 b 的大小,不能使用大于、 小于、if 语句#define Max(a,b) ( a/b)?a:b 如何输出源文件的标题和目前执行行的行数int line = _LINE_; char *file = _FILE_; coutfile name is (file),line
18、 is lineendl; 两个数相乘,小数点后位数没有限制,请写一个高精度算法写一个病毒while (1) int *p = new int10000000; 不使用额外空间,将 A,B 两链表的元素交叉归并将树序列化转存在数组或链表中struct st int i; short s; char c; ; sizeof(struct st); 8 char * p1; void * p2; int p3; char p410; sizeof(p1.p4) =? 4,4,4,10 二分查找快速排序双向链表的删除结点给一个奇数阶N 幻方,填入数字1,2,3.N*N, 使得横竖斜方向上的和都相同答
19、案 : #include #include #include using namespace std; int main() int n; cinn; int i; int *Matr=new int*n;/动态分配二维数组for(i=0;in;+i) Matr i =new intn;/动态分配二维数组/j=n/2 代表首行中间数作为起点,即1 所在位置int j=n/2,num=1;/初始值i=0; while(num!=n*n+1) /往右上角延升,若超出则用%转移到左下角Matr(i%n+n)%n(j%n+n)%n=num; /斜行的长度和n 是相等的,超出则转至下一 斜 行if(nu
20、m%n=0) i+; else i-; j+; num+; for(i=0;in;i+) for(j=0;jn;+j) coutsetw(int)log10(n*n)+4)Matr i j ;/ 格 式 控 制coutendlendl;/ 格 式 控 制 for(i=0;in;+i) delete Matr i ; return 1; 腾讯的一道面试题:(与百度相似 ,可惜昨天百度死在这方面了)/ 在一个文件中有10G 个整数,乱序排列,要求找出中位数。内存限制为2G。只写出思路即可。答案 : 1, 把整数分成256M 段, 每段可以用64 位整数保存该段数据个数,256M*8 = 2G 内存
21、,先清0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 25 页 - - - - - - - - - 2,读 10G 整数,把整数映射到256M 段中,增加相应段的记数3,扫描 256M 段的记数, 找到中位数的段和中位数的段前面所有段的记数,可以把其他段的内存释放4,因中位数段的可能整数取值已经比较小(如果是32bit 整数,当然如果是64bit 整数的话,可以再次分段),对每个整数做一个记数,再读一次10G 整 数,只读取中位数段对应的整数,并设置记数。5, 对新的
22、记数扫描一次,即可找到中位数。如果是32bit 整数,读 10G 整数2 次,扫描256M 记数一次,后一次记数因数量很小,可以忽略不记(设是32bit 整数,按无符号整数处理整数分成256M 段?整数范围是0 - 232 - 1 一共有4G 种取值,4G/256M = 16,每 16 个数算一段0-15 是 1 段,16-31 是一段, . 整数映射到256M 段中?如果整数是0-15,则增加第一段记数,如果整数是16-31,则增加第二段记数,. 其实可以不用分256M 段,可以分的段数少一写,这样在扫描记数段时会快一些, 还能节省一些内存) 腾讯题二 : 一个文件中有40 亿个整数, 每个
23、整数为四个字节,内存为1GB,写出一个 算法:求出这个文件里的整数里不包含的一个整数答: 方法一 : 4 个字节表示的整数,总共只有232 约等于4G 个可能。为了简单起见,可以假设都是无符号整数。分配500MB 内存,每一bit 代表一个整数,刚好可以表示完4 个字节的整数,初始值为0。基本思想每读入一个数,就把它对应的bit 位置为,处理完40G 个数后,对500M 的内存遍历,找出一个bit 为 0 的位,输出对应的整数就是未出现的。算法流程:)分配内存buf,初始化为) unsigned int x=0 x1; for each int j in file buf=buf x j; e
24、nd (3) for(unsigned int i=0; i = 0 xffffffff; i+) if (!(buf & x i) output(i); break; 以上只是针对无符号的,有符号的整数可以依此类推。方法二 : 文件可以分段读啊,这个是O (2n) 算法,应该是很快的了, 而且空间也允许的。 不过还可以构造更快的方法的,更快的方法主要是针对定位输出的整数优化算法。思路 大 概 是 这 样 的 , 把 值 空 间 等 分 成 若 干 个 值 段 , 比 如 值 为 无 符 号 数 ,则00000000H-00000FFFH 00001000H-00001FFFH . 0000F
25、000H-0000FFFFH . FFFFF000H-FFFFFFFFH 这样可以订立一个规则,在一个值段范围内的数第一次出现时,对应值 段指示值Xn=Xn+1,如果该值段的所有整数都出现过,则Xn=1000H, 这样后面输出定位时就可以直接跳过这个值段了,因为题目 仅仅要求输出一个,这样可以大大减少后面对标志数值的遍历步骤。理论上值段的划分有一定的算法可以快速的实现,比如利用位运算直接定位值段对应值进行计算。腾讯面试题 : 有 1 到 10w 这 10w 个数,去除2 个并打乱次序,如何找出那两个数。(不准用位图!)位图解决 : 位图的方法如下假设待处理数组为A10w-2 定义一个数组B10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年c、c+笔试题 面试题 2022 c+ 笔试 试题
限制150内