




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2010C、C++笔试题大全,被问的概率几乎100%。
很少有真正精通了c语言编程的学员,一般都有或多或少概念不是完全清楚的问题,
特别是一些需要丰富的实战经验才能体会和明白的问题,如字符串,指针,类型转换,定义
指向函数的指针类型,这也是导致学习c困难的一个原因。下面有几个简单测试将能发现
你对C语言的掌握情况。
1)intx=35;
charstr[10];
〃问:strien(str)和sizeof(str)的值分别是多少?
答:strlen(str)值不确定,strlen根据1V),确定字符串是否结束。
sizeof(str)=10sizeof一个数组为数组长度
strcpy(str,"”/*共13个字母*/);
//问:此时x和strlen(str)的值分别是多少?
答:x为35
strcpy(char*dest,constchar*src)
根据src来复制dest,健src的、O'决定复制的长度,而dest必须要提供足够的长度,这
里会引起溢出,strlen返回13,但是数组外部的数据已经被破坏
strlen的值为13,在VC++环境下,x的值是要改变的(其他编译器下没试,).虽然表面上看来,
在程序中并没有修改x的值,但是实际运行的结果是上面的x的值发生了修改,这是因为
strcpy以后,把多余的数据拷贝进了str的邻居(int类型的x)中,所以x的数据也就变了.这是•
个曾让我刻骨铭心的问题,在我刚出道时遇到这个问题,虽然在朋友的帮助下解决了这个问题,
但一直不明白x的值为何变了,只有最后走上培训教师的岗位,才开始梳理自己曾经的困惑,
才开始总结以前的经验供学员们借鉴.我觉得这个题目的价值非常之大,它能引起学员对字符
串拷贝越界问题的足够重视,并且通过这个问题更能明白字符串的处理是怎么回时,更能明白
字符串与字符数组的关系:字符串就是一个字符数组,只是把这个字符数组用在处理串的函数
中时,这些函数不考虑数组的长度,只是记住数组的首地址,从首地址开始处理,并在遇到0时
结束处理,
3)charstr|10];
str="";//alsocanuse:memcpy(str,"")
〃编译能通过吗?
答:数组不能赋值,只能初始化。charstr[10]="";
而且初始化时编译器会检查数组的长度与初始化串的长度是否匹配
4)char*pstr;
strcpy(pstr,"");〃需要初始化并分配空间
//上句编译能通过吗?运行时有问题吗?
答:可以通过编译,但是pstr指向了常量区,运行忖最好只做读操作,写操作不保险。
编译可以通过,但是pstr没有进行有效的初始化,它指向了一个不确定的内存区,运行时会
出现内存不可写错误!
constchar*p1;
char*constp2;//const指针必须初始化
〃上面两句有什么区别吗?
答:constchar*和charconst*一样,都是表示指向常量的字符指针。
char*const表示指向字符的常量指针
pl=(constchar*)str;
〃如果是pl=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=(k>ng)pstr;〃可以这样做吗?
答:可以,y的值为pstr所指的地址。不过如果是纯粹要地址的话,最好是用unsignedlong。
int*p=str;
*p=0x00313200;
printf("%s",str);〃会是什么效果?提示0x31对应字符T,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,所以字符串为M)'开头,什么都打印不出来。这里有个Big-endin
和little-endin的问题。以0x31323334为例
little-endin的机器上面,0x31323334在内存中排列顺序为34333231,鼬为4321,如INTEL
芯片的pc
big-endin机器上面为31323334,输出为1234,如IBMPOWERPC
p=3000;//p+l的结果会是多少?
答: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就袤来揖向遮■时■■■
参数的函数指针类型了。
可以用来定义这样的变量:
比如有个函数为intfun(intx,inty);
PFUNp=fun;
补充::函数指针最大的用处在于它可以被一个模板方法调用,这是我在学java的设计模式时
领悟到的.例如,有两个函数的流程结构完全一致,只是内部调用的具体函数不同,如下所示:
voidfuncl()
(
//一段流程代码和面向方面的代理,如安全检查,日志记录等
intsum=add(x,y);
〃一段流程代码和面向方面的代理,如安全检查,日志记录等
)
voidfunc2()
(
〃与fund完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
intdifference=sub(x,y);
〃与fund完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
}
那么,可以只定义一个函数,如下所示
voidfunc(PFUNCp)
(
〃与funcl完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
intdifference=p(x,y);
〃与funcl完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
)
调用程序在调用时,让参数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空x5
MFC将树序列化转存在数组或链表中!
1,计算a?<<2(运算符优先级问题)
2根据先序中序求后序
3a[3][4]哪个不能表示a[l][l]:*(&a[0][0])*(*(a+l)+l)*(&a[l]+l)*(&a[0][0]+4)
4for(inti...)
for(intj...)
printf(i,j);
printf(j)
会出现什么问题
5for(i=0;i<10;++i,sum+=i);的运行结果
610个数顺序插入查找二叉树,元素62的比较次数
710个数放入模lOhash链表,最大长度是多少
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把字符串转换为小写,不成功返回INULL,成功返叵]新串
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)
sDestfsLen]=toLowerChar(sSrcStr[sLen]);
)
returnsDest;
2把字符串转换为整数例如:”-123“->-123
main()
if("string)
n=1
else
n=num(string);
intnum(char*string)
for(;!(*string==O);string++)
intk;
k=_2;
j=-sLen;
while(—3—)
k=k*10;
num=num+k;
returnnum;
}
附加题:
1linux下调试core的命令,察看堆栈状态命令
2写出socks套接字服务端客户端通讯程序
3填空补全程序,按照我的理解是添入:Win32调入川的函数名
查找函数入口的函数名找到函数的调用形式
把formView力口至Usingledoc的声明将singledoc力口到app的声明
4有关系s(sno,sname)c(cno,cname)sc(sno,eno,grade)
1问上课程“db”的学生no
2成绩最高的学生号
3每科大于90分的人数
主要是C/C++、数据结构、操作系统等方面的基础知识。好像有sizeof、树等选
择题。填空题是补充完整程序。附加题有写算法的、编程的、数据库sql语句查
询的。还有一张开放性问题。
请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
#defineMix(a,b)(a/b)?a:b
如何输出源文件的标题和目前执行行的行数
intline=_LINE_;
char*file=_FILE_;
cout«"filenameis"«(file)«",lineis"«line«endl;
两个数相乘,小数点后位数没有限制,请写一个高精度算法
写一个病毒
while(1)
(
int*p=newint[10000000];
)
不使用额外空间,将A,B两链表的元素交叉归并
将树序列化转存在数组或链表中
structst{
inti;
shorts;
charc;
sizeof(structst);
8
char*pl;
void*p2;
intp3;
charp4[10];
sizeof(pl...p4)=?
4,4,4,10
二分查找
快速排序
双向链表的删除结点
有12个小球,外形相同,其中一个小球的质量与其他11个不同
给一个天平,问如何用3次把这个小球找出来
并且求出这个小球是比其他的轻还是重
解答:
哈哈,据说这是微软前儿年的一个面试题。很经典滴啊!三次一定能求出来,而
且能确定是重还是轻。
数据结构的知识还没怎么学透,不过这个题我到是自己研究过,可以分析下。
将12个球分别编号为al,a2,a3.……al0,all,al2.
第一步:将12球分开3拨,每拨4个,al~a4第一拨,记为bl,a5~a6第2拨,
记为b2,其余第3拨,记为b3;
第二步:将bl和b2放到天平两盘上,记左盘为cl,右为c2;这时候分两中情
况:
l.cl和c2平衡,此时可以确定从al到a8都是常球;然后把c2拿空,并从cl
上拿下a4,从a9到al2四球里随便取三球,假设为a9到all,放到c2上。此
时cl上是al到a3,c2上是a9到all。从这里又分三种情况:
A:天平平衡,很简单,说明没有放上去的al2就是异球,而到此步一共称了
两次,所以将al2随便跟11个常球再称一次,也就是第三次,马上就可以确定
al2是重还是轻;
B:若cl上升,则这次称说明异球为a9到all三球中的一个,而且是比常球
重。取下cl所有的球,并将a8放到cl上,将a9取下,比较a8和all(第三次
称),如果平衡则说明从c2上取下的a9是偏重异球,如果不平衡,则偏向哪盘
则哪盘里放的就是偏重异球;
C:若cl下降,说明a9到all里有一个是偏轻异球。次种情况和B类似,所
以接下来的步骤照搬B就是;
2.C1和c2不平衡,这时候又分两种情况,cl上升和cl下降,但是不管哪种情况
都能说明a9到al2是常球。这步是解题的关键。也是这个题最妙的地方。
A:cl上升,此时不能判断异球在哪盘也不能判断是轻还是重。取下cl中的
a2到a4三球放一边,将c2中的a5和a6放到cl上,然后将常球a9放到c2上。
至此,cl上是al,a5和a6,c2上是a7,a8和a9。此时又分三中情况:
1)如果平衡,说明天平上所有的球都是常球,异球在从cl上取下a2到a4
中。而且可以断定异球轻重。因为a5到a8都是常球,而第2次称的时候cl是
上升的,所以a2到a4里必然有一个轻球。那么第三次称就用来从a2到a4中找
到轻球。这很简单,随便拿两球放到cl和c2,平衡则剩余的为要找球,不平衡
则哪边低则哪个为要找球;
2)cl仍然保持上升,则说明要么al是要找的轻球,要么a7和a8两球中
有一个是重球(这步懂吧?好好想想,很简单的。因为a9是常球,而取下的a2
到a4肯定也是常球,还可以推出换盘放置的a5和a6也是常球。所以要么al轻,
要么a7或a8重)。至此,还剩一次称的机会。只需把a7和a8放上两盘,平衡
则说明al是要找的偏轻异球,如果不平衡,则哪边高说明哪个是偏重异球;
3)如果换球称第2次后天平平衡打破,并且cl降低了,这说明异球肯定
在换过来的a5和a6两求中,并且异球偏重,否则天平要么平衡要么保持cl上
升。确定要找球是偏重之后,将a5和a6放到两盘上称第3次根据哪边高可以判
定a5和a6哪个是重球;
B:第1次称后cl是下降的,此时可以将cl看成c2,其实以后的步骤都同A,
所以就不必要再重复叙述了。至此,不管情况如何,用且只用三次就能称出12
个外观手感一模一样的小球中有质量不同于其他11球的偏常的球。而且在称的
过程中可以判定其是偏轻还是偏重。
给一个奇数阶N幻方,填入数字1,2,3…N*N,使得横竖斜方向上的和都相同
答案:
#include<iostream>
#include<iomanip>
#include<cmath>
usingnamespacestd;
intmain()
(
intn;
cin»n;
inti;
int**Matr二newint*[n];〃动态分配二维数组
for(i=0;i<n;++i)
Matr[i]=newint[n];〃动态分配二维数组
//j二n/2代表首行中间数作为起点,即1所在位置
intj=n/2,nunFl;〃初始值
i=0;
while(num!=n*n+1)
{
〃往右上角延升,若超出则用%转移到左下角
Matr[(i%n+n)%n][(j%n+n)%n]=num;
〃斜行的长度和n是相等的,超出则转至下一斜行
if(num%n==O)
i++;
else
j++;
)
num++;
)
for(i=0;i<n;i++)
(
for(j=0;j<n;++j)
cout«setw((int)loglO(n*n)+4)<<Matr[i][j];〃格式控制
cout<<endl<<endl;〃格式控制
)
for(i=0;i<n;++i)
delete[]Matr[i];
return1;
)
腾讯的一道面试题:(与百度相似,可惜昨天百度死在这方面了"〃/
在一个文件中有10G个整数,乱序排列,要求找出中位数。内存限制为2G。只
写出思路即可。
答案:
1,把整数分成256M段,每段可以用64位整数保存该段数据个数,256M*8=2G
内存,先清0
2,读10G整数,把整数映射到256M段中,增加相应段的记数
3,扫描256M段的记数,找到中位数的段和中位数的段前面所有段的记数,
可以把其他段的内存释放
4,因中位数段的可能整数取值已经比较小(如果是32bit整数,当然如果是
64bit整数的话,可以再次分段),对每个整数做一个记数,再读一次10G整
数,只读取中位数段对应的整数,并设置记数。
5,对新的记数扫描一次,即可找到中位数。
如果是32bit整数,读10G整数2次,扫描256M记数一次,后一次记数因
数量很小,可以忽略不记
(设是32bit整数,按无符号整数处理
整数分成256M段?整数范围是0-2A32-1一共有4G种取值,
4G/256M=16,每16个数算一段0-15是1段,16-31是一段,…
整数映射到256M段中?如果整数是0-15,则增加第一段记数,如果整
数是16-31,则增加第二段记数,...
其实可以不用分256M段,可以分的段数少一写,这样在扫描记数段时
会快一些,还能节省一些内存)
腾讯题二:
一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个
算法:求出这个文件里的整数里不包含的一个整数
答:
方法一:4个字节表示的整数,总共只有2A32约等于4G个可能。
为了简单起见,可以假设都是无符号整数。
分配500MB内存,每-bit代表一个整数,刚好可以表示完4个字节的
整数,初始值为0。基本思想每读入一个数,就把它对应的bit位置为1,
处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出
对应的整数就是未出现的。
算法流程:
1)分配500MB内存buf,初始化为0
2)unsignedintx=0xl;
foreachintjinfile
buf=bufix<<j;
end
(3)for(unsignedinti=0;i<=Oxffffffff;i++)
if(!(buf&x<<i))
(
output(i);
break;
)
以上只是针对无符号的,有符号的整数可以依此类推。
方法二:
文件可以分段读啊,这个是0(2n)算法,应该是很快的了,而且空间也允
许的。
不过还可以构造更快的方法的,更快的方法主要是针对定位输出的整数
优化算法。
思路大概是这样的,把值空间等分成若干个值段,比如值为无符号数,
则
00000000H-00000FFFH
00001000H-00001FFFH
0000F000H-0000FFFFH
FFFFF000H-FFFFFFFFH
这样可以订立一个规则,在一个值段范围内的数第一次出现时,对应值
段指示值Xn=Xn+l,如果该值段的所有整数都出现过,则Xn=1000H,
这样后面输出定位时就可以直接跳过这个值段了,因为题目仅仅要求输
出一个,这样可以大大减少后面对标志数值的遍历步骤。
理论上值段的划分有一定的算法可以快速的实现,比如利用位运算直接
定位值段对应值进行计算。
腾讯面试题:
有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数。(不
准用位图!!)
位图解决:
位图的方法如下
假设待处理数组为A[10w-2]
定义一个数组B[10w],这里假设B中每个元素占用1比特,并初始化为全0
for(i=0;i<10w-2;i++)
(
B[A[i]]=1
)
那么B中不为零的元素即为缺少的数据
这种方法的效率非常高,是计算机中最常用的算法之一
其它方法:
求和以及平方和可以得到结果,不过可能求平方和运算量比较大(用64
位int不会溢出)
腾讯面试题:
腾讯服务器每秒有2w个QQ号同时上线,找出5min内重新登入的qq号并
打印出来。
解答:第二题如果空间足够大,可以定义一个大的数组
a[qq号],初始为零,然后这个qq号登陆了就a[qq号]++
最后统计大于等于2的QQ号
这个用空间来代替时间
第二个题目,有不成熟的想法。
2wx3OOs
所以用6,000,000个桶。删除超口寸的算法后面说,所以平均桶的大小是1o
假设qq号码一共有1070个,所以每个桶装的q号码
是1070/(6*10A6)个,这个是插入时候的最坏效率(插入同一个桶的
时候是顺序查找插入位置的)。
qq的节点结构和上面大家讨论的基本一样,增加一个指针指向输出列表,
后面说。
structQQstruct{
num_typeqqnum;
timestamplast_logon_time;
QQstruct*pre;
QQstruct*next;
OutPutList*out;//用于free节点的时候,顺便更新一下输出列表。
另外增加两个指针列表。
第一个大小300的循环链表,自带一个指向QQStruct的域,循环存300秒
内的qq指针。时间一过
就free掉,所以保证所有桶占用的空间在2wX300以内。
第二个是输出列表,就是存放题目需要输出的节点。
如果登陆的用户,5分钟内完全没有重复的话,每秒free掉2w个节点。
不过在free的时候,要判断一下时间是不是真的超时,因为把节点入桶
的时候,遇到重复的,会更
新一下最后登陆的时间。当然啦,这个时候,要把这个qq号码放到需要
输出的列表里面
1、局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。要用全局变量,需要使用"::"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局
部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义
多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个
局部变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量?
答:extern
可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式
来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期
间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期
间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
答:可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文
件中对此变量赋初值,此时连接不会出错
4、语句for(;1;)有什么问题?它是什么意思?
答:和while⑴相同。
5、dowhile和whiledo有什么区别?
答:前一个循环一遍再判断,后一个判断以后再循环
6、请写出下列代码的输出内容
#include<stdio.h>
main()
(
inta,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf(nb,c,d:%d,%d,%d\b,c,d);
return0;
)
答:10,12,120
7、static全局变量与普通的全局变量有什么区别?static局部变量和普通局
部变量有什么区别?static函数与普通函数有什么区别?
全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全
局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者
在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源
程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中
都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件
内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用
域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它
源文件中引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方
式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限
制了它的使用范围。
static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的
函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对
于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数
的源文件要包含这个头文件
static全局变量与普通的全局变量有什么区别:static全局变量只初使化-一次,
防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,
下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数
在每个被调用中维持一份拷贝
8、程序的局部变量存在于(栈)中,全局变量存在于(静态区)中,动态
申请数据存在于(堆)中。
9、设有以下说明和定义:
typedefunion{longi;intk[5];charc;}DATE;
structdata{intcat;DATEcow;doubledog;}too;
DATEmax;
则语句printf('1%dn,sizeof(structdate)+sizeof(max));的执行结果是:__52
答:DATE是一个union,变量公用空间.里面最大的变量类型是int[5],占
用20个字节.所以它的大小是20
data是一个struct,每个变量分开占用空间.依次为int4+DATE20+double8=
32.
所以结果是20+32=52.
当然…在某些16位编辑器下,int可能是2字节,那么结果是int2+DATE10+
double8=20
10、队列和栈有什么区别?
队列先进先出,栈后进先出
11、写出下列代码的输出内容
#include<stdio.h>
intinc(inta)
(
retum(++a);
)
intmulti(int*a,int*b,int*c)
(
return(*c=*a**b);
)
typedefint(FUNCl)(intin);
typedefint(FUNC2)(int*,int*,int*);
voidshow(FUNC2fun,intargl,int*arg2)
(
INCp=&inc;
inttemp=p(argl);
fun(&temp,&arg1,arg2);
printf(n%d\nn,*arg2);
main()
inta;
show(multi,10,&a);
return0;
)
答:110
12、请找出下面代码中的所以错误
说明:以下代码是把一个字符串倒序,如“abed”倒序后变为“deba”
1、#include',string.hn
2、main()
3、(
4、char*src=*'hello,world";
5、char*dest=NULL;
6、intlen=strlen(src);
7、dest=(char*)malloc(len);
8、char*d=dest;
9、char*s=src[len];
10>while(len—!=0)
11、d++=s--;
12、printf(n%s,r,dest);
13、return0;
14、)
答:
方法1:
intmain()
(
char*sre="hello,world'1;
intlen=strlen(src);
char*dest=(char*)malloc(len+l);〃要为\0分配•个空间
char*d=dest;
char*s=&src[len-l];〃指向最后一个字符
while(len—!=0)
*d++=*s--;
*d=0;〃尾部要加\0
printf(,,%s\n,,,dest);
free(dest);//使用完,应当释放空间,以免造成内存汇泄露
return0;
方法2:
#include<stdio.h>
#include<string.h>
main()
(
charstr[]=nhello,worldn;
intlen=strlen(str);
chart;
for(inti=0;i<len/2;i++)
(
t=str[i];
str[i]=str[len-i-l];str[len-i-l]=t;
)
printf("%s",str);
return0;
}
1.-1,2,7,28,,126请问28和126中间那个数是什么?为什么?
第一题的答案应该是4A3-1=63
规律是M3-l(当n为偶数0,2,4)23+1(当n为奇数1,3,5)
答案:63
2.用两个栈实现一个队列的功能?要求给出算法和思路!
设2个栈为A,B,一开始均为空.
入队:
将新元素push入栈A;
出队:
(1)判断栈B是否为空;
(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;
⑶将栈B的栈顶元素pop出;
这样实现的队列入队和出队的平摊复杂度都还是0(1),比上面的儿种方法要
好。
3.在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型
是什么?
函I明(名,atol
功能:把字符串转换成长整型数
用法:longatol(constchar*nptr);
程序例:
#include<stdlib.h>
#include<stdio.h>
intmain(void)
(
long1;
char*str="98765432";
I=atol(lstr);
printf("string=%sinteger=%ld\n",str,1);
return(0);
)
13.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什
么实现?
c用宏定义,C++用inline
17徽件测试都有那些种类?
黑盒:针对系统功能的测试
白合:测试函数功能,各函数接口
18.确定模块的功能和模块的接口是在软件设计的那个队段完成的?
概要设计阶段
19.
enumstring
{
xl,
x2,
x3=10,
x4,
x5,
}x;
问x=0x801005,0x8010f4;
20.
unsignedchar*pl;
unsignedlong*p2;
pl=(unsignedchar*)0x801000;
p2=(unsignedlong*)0x810000;
请问pl+5=;
p2+5=;
25.请问下面程序有什么错误?
inta[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i]U][k]=O;
把循环语句内外换一下
26.
#defineMax_CB500
voidLmiQueryCSmd(StructMSgCB*pmsg)
|
unsignedcharucCmdNum;
for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
死循环
27.以下是求一个数的平方的程序,请找出错误:
#defineSQUARE(a)((a)*(a))
inta=5;
intb;
b=SQUARE(a++);
28.
typedefunsignedcharBYTE
intexamply_fun(BYTEgt_len;BYTE*gt_code)
(
BYTE*gt_buf;
gt_buf=(BYTE*)MALLOC(Max_GT_Length);
if(gt_len>Max_GT_Length)
returnGT_Length_ERROR;
C语言面试题大汇总之华为面试题
Eddy整理
1、局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。要用全局变量,需要使用"::";局部变量可以与全局变量同名,在函数内引用
这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同个函数内可以
定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就
在那个循环体内。
2、如何引用个已经定义过的全局变量?
答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在
头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用
时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名
的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.
4、请写出下列代码的输出内容
#include<stdio.h>
intmain(void)
{
inta,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b.c,d:%d,%d,%d",b,c,d);
return0;
}
答:10,12,120
5,static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函
数与普通函数有什么区别?
答:1)全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态
存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别在于非
静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文
件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程
序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函
数公用,因此可以避免在其它源文件中引起错误。
2)从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围.3)static
函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内
部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,
要使用这些函数的源文件要包含这个头文件
综上所述:
static全局变量与普通的全局变量有什么区别:
static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:
static局部变量只被初始化一次,下一次依据上一次结果值:
static函数与普通函数有什么区别:
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
6、程序的局部变量存在于(栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。
7、设有以下说明和定义:
typedefunion
(
longi;
intk[5];
charc;
}DATE;
structdata
(
intcat;
DATEcow;
doubledog;
}too;
DATEmax;
则语句printf("%d",sizeof(structdata)+sizeof(max));的执行结果是:___52____
考点:区别struct与union.(一般假定在32位机器I.)
答:DATE是一个union,变量公用空间.里面最大的变量类型是int[5],占用20个字节.所以它的大小
是20.data是一个struct,每个变量分开占用空间.依次为int4+DATE20+doubles=32.所以结
果是20+32=52.当然…在某些16位编辑器F,int可能是2字节,那么结果是int2+DATE10+
double8=20
8、队列和栈有什么区别?
队列先进先出,栈后进先出
9、写出下列代码的输出内容
#include<stdio.h>
intinc(inta)
{return(++a);}
intmulti(int*a,int*b,int*c)
{return(*c=*a**b);}
typedefint(FUNC1)(intin);
typedefint(FUNC2)(int*,int*,int*);
voidshow(FUNC2fun,intarg1,int*arg2)
FUNC1p=&inc;
inttemp=p(arg1);
fun(&temp,&arg1,arg2);
printf("%dn",*arg2);
)
main()
(
inta;〃局部变量a为。;
show(multi,10,&a);
return0;
)
答:110
10、请找出下面代码中的所有错误(题目不错,值得•看)
说明:以下代码是把一个字符串倒序,如“abed”倒序后变为“dcba”
#include"string.h"
main()
{
char*src="hello,world";
char*dest=NULL;
intlen=strlen(src);
dest=(char*)malloc(len);
char*d=dest;
char*s=src[len];
while(len--!=0)
d++=s--;
printf(n%s",dest);
return0;
)
答:
方法1:一共有4个错误;
intmain()
{
char*sre=Hhello,world'1;
intlen=strlen(src);
char*dest=(char*)malloc(len+1);〃要为分配一个空间char*d=dest;
char*s=&src[len-1];〃指向最后一个字符
while(len--!=0)
*d++=*s--;
*d=0;〃尾部要加'\0'
printf("%sn,',dest);
free(dest);//使用完,应当释放空间,以免造成内存汇泄露
dest=NULL;〃防止产生野指针
return0;
)
方法2:(方法•需要额外的存储空间,效率不高.)不错的想法
#include<stdio.h>
#include<string.h>
main()
{
charstr[]=nhello,world";
intlen=strlen(str);
chart;
for(inti=0;i<len/2;i++)
(
t=str[i];
str[i]=str[len-i-1];〃小心一点
str[len-i-1]=t;
)
printf(r,%s",str);
return0;
)
11.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
c用宏定义,C++用inline
12.直接链接两个信令点的一组链路称作什么?
PPP点到点连接
13.接入网用的是什么接口?
V5接口
14.voip都用了那些协议?
H.323协议簇、SIP协议、Skype协议、H.248和MGCP协议
15.软件测试都有那些种类?
黑盒:针对系统功能的测试
白盒:测试函数功能,各函数接口
16.确定模块的功能和模块的接口是在软件设计的那个队段完成的?
概要设计阶段
17.
unsignedchar*p1;
unsignedlong*p2;
p1=(unsignedchar*)0x801000;
p2=(unsignedlong*)0x810000;
请问p1+5=;
p2+5=;
答案:0x801005(相当于加上5位)Ox案0014(相当于加上20位);
选择题:
21.Ethternet链接到Internet用到以下那个协议?D
A.HDLC;B.ARP;C.UDP;D.TCP;E.lD
22.属于网络层协议的是:(BC)
A.TCP;B.IP;C.ICMP;D.X.25
23.Windows消息调度机制是:(C)
A.指令队歹iJ;B.指令堆栈;C.消息队歹U;D.消息堆栈;
找错题:
25.请问下面程序有什么错误?
inta[60][250][1000],i,j,k;
for(k=O;kMax_GT_Length)
{returnGT_Length_ERROR;
}.……}
答:死循环〃
问答题:
29.IPPhone的原理是什么?
IP电话(又称IPPHONE或VoIP)是建立在IP技术上的分组化、数字化传输技术,其基本原理是:
通过语音压缩算法对语音数据进行压缩编码处理,然后把这些语音数据按IP等相关协议进行打包,经过IP
网络把数据包传输到接收地,再把这些语音数据包串起来,经过解码解压处理后,恢复成原来的语音信号,从
而达到由IP网络传送语音的目的。
30.TCP/IP通信建立的过程怎样,端口有什么作用?
三次握手,确定是呱个应用程序使用该协议
31.1号信令和7号信令有什么区别,我国某前广泛使用的是那一种?
1号信令接续慢,但是稳定,可靠。
7号信令的特点是:信令速度快,具有提供大量信令的潜力,具有改变和增加信令的灵活性,便于开放
新业务,在通话时可以随意处理信令,成本低。目前得到广泛应用。
32.列举5种以上的电话新业务
如“闹钟服务”、“免干扰服务”、“热线服务”、“转移呼叫”、“遇忙回叫"、"缺席用户服务”、“追杳恶意呼叫”、
“三方通话"、“会议电话"、"呼出限制"、“来电显示"、"虚拟网电话”等
四.找错题:
1.请问下面程序有什么错误?
inta[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=O;
答:把循环语句内外换一下
2.#defineMax_CB500
voidLmiQueryCSmd(StructMSgCB*pmsg)
{
unsignedcharucCmdNum;
for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
答:死循环,unsignedint的取值范围是0~255
3.以下是求•个数的平方的程序,请找出错误:
#defineSQUARE(a)((a)*(a))
inta=5;
intb;
b=SQUARE(a++);
答:结果与编译器相关,得到的可能不是平方值.
微软亚洲技术中心的面试题!!!
1.进程和线程的差别。
答:线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同•个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或
撤消线程时的开销。
2.测试方法
答:人工测试:个人复查、抽查和会审
机器测试:黑盒测试和白盒测试
3.Heap与stack的差别。
答:Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进
行
4.Windows下的内存是如何管理的?
分页管理
8.谈谈IA32下的分页机制
小页(4K)两级分页模式,大页(4M)一级
9.给两个变量,如何找出一个带环单链表中是什么地方出现环的?
一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方
10.在IA32中一共有多少种办法从用户态跳到内核态?
通过调用门,从ring3到ring。,中断从ring3到ring。,进入vm86等等
11.如果只想让程序有一个实例运行,不能运行两个。像winamp•样,只能开一个窗口,怎样实现?
用内存映射或全局原子(互斥变量)、查找窗口句柄..
FindWindow,互斥,写标志到文件或注册表,共享内存。.
12.如何截取键盘的响应,让所有的宣变成'b’?
答:键盘钩子SetWindowsHookEx
14.存储过程是什么?有什么用?有什么优点?
答:我的理解就是一堆sql的集合,可以建立非常复杂的查询,编译运行,所以运行一次后,以后再运行
速度比单独执行SQL快很多
15.Template有什么特点?什么时候用?
答:Template可以独立于任何特定的类型编写代码,是泛型编程的基础.
当我们编写的类和函数能够多态的用于跨越编译时不相关的类型时,用Template.
模板主要用于STL中的容器,算法,迭代器等以及模板元编程.
(C++的template是实现在摩设计和嵌入式设计中的关键。
template能实现抽象和效率的结合;同时template还能有效地防止代码膨胀)
16.谈谈WindowsDNA结构的特点和优点。
答:WindowsDistributedinterNetApplicationArchitecture(Windows分布式应用结构,简称
WindowsDNA)是微软创建新•代高适应性商业解决方案的框架,它使公司能够充分地挖掘数字神经系
统的优点。WindowsDNA是第一个将Internet、客户/服务器、和用于计算的PC模型结合并集成在一
起的为新一类分布式计算方案而设计的应用软件体系结构
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 配电知识培训课件
- 配电基础知识培训
- 长沙医学院《高等数学Ⅰ(下)》2023-2024学年第一学期期末试卷
- 2025年陕西省商洛市洛南县重点名校初三下学期第一次月考试题化学试题试卷含解析
- 遵义师范学院《经典译著赏析》2023-2024学年第二学期期末试卷
- 德阳农业科技职业学院《国际新闻作品案例解析》2023-2024学年第二学期期末试卷
- 二甲护理条款解读
- 广西贵港市覃塘区重点名校2025年高中毕业班第二次模拟(英语试题文)试卷含答案
- 2025届山东省泰安一中、宁阳一中高三第四次月考(物理试题理)试题含解析
- 海南省琼海市嘉积中心校2024-2025学年三年级数学第二学期期末联考试题含解析
- 物种起源少儿彩绘版
- 人才培养方案企业调研
- 第6课《求助电话》课件
- 旅游业品牌塑造与形象传播策略
- 单片机恒压供水系统设计
- 《冠心病的中医防治》课件
- 数据中心建设项目可行性研究报告
- 【高新技术企业所得税税务筹划探析案例:以科大讯飞为例13000字(论文)】
- 口中有异味中医巧辨治
- 药品包装材料和容器变更研究及案例分析汇编
- 中国地理概况(疆域、行政区、人口、民族)课件
评论
0/150
提交评论