2022年史上最全的IT公司面试题知识 .pdf
《2022年史上最全的IT公司面试题知识 .pdf》由会员分享,可在线阅读,更多相关《2022年史上最全的IT公司面试题知识 .pdf(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.引用与指针有什么区别?1) 引用必须被初始化,指针不必。2) 引用初始化以后不能被改变,指针可以改变所指的对象。3) 不存在指向空值的引用,但是存在指向空值的指针。2. 堆栈溢出一般是由什么原因导致的?没有回收垃圾资源。3. 什么函数不能声明为虚函数? constructor函数不能声明为虚函数。4. 写出 float x 与“ 零值 ” 比较的 if 语句。 if(x0.000001&x-0.000001) 5. 不能做 switch()的参数类型是: switch的参数不能为实型6. 头文件中的ifndef/define/endif干什么用 ? 预处理答:防止头文件被重复引用7. #i
2、nclude 和 #include filename.h 有什么区别 ? 答:对于 #include ,编译器从标准库路径开始搜索filename.h 对于 #include filename.h ,编译器从用户的工作路径开始搜索filename.h 8. 在 C+ 程序中调用被C 编译器编译后的函数,为什么要加extern “ C”声明 ? 答:函数和变量被C+ 编译后在符号库中的名字与C 语言的不同,被extern C修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C+ 程序不能直接调用C 函数。 C+ 提供了一个C 连接交换指定符号extern “C” 来解决这个问题
3、。9. char str1 = abc; char str2 = abc; const char str3 = abc; const char str4 = abc; const char *str5 = abc; const char *str6 = abc; char *str7 = abc; char *str8 = abc; cout ( str1 = str2 ) endl; cout ( str3 = str4 ) endl; cout ( str5 = str6 ) endl; cout ( str7 = str8 ) endl; 名师资料总结 - - -精品资料欢迎下载 - -
4、 - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 44 页 - - - - - - - - - 结果是: 0 0 1 1 str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。10. main() int a5=1,2,3,4,5; int *ptr=(int *)(&a+1); printf(%d,%d,*(a+1),*(ptr-1); 答: 2,5 *(a+1)就是 a1 ,*(ptr-1)就是 a4, 执行结果是2, 5 。&
5、a+1不是首地址 +1 ,系统会认为加一个a 数组的偏移,是偏移了一个数组的大小(本例是 5 个 int) 。int *ptr=(int *)(&a+1); 则 ptr 实际是 &(a5),也就是 a+5 原因如下:&a 是数组指针, 其类型为int (*)5; 而指针加1 要根据指针类型加上一定的值,不同类型的指针+1 之后增加的大小不同 ; a 是长度为5 的 int 数组指针,所以要加5*sizeof(int)。所以 ptr 实际是 a5 。但是 prt 与(&a+1)类型是不一样的(这点很重要 ),所以 prt-1只会减去sizeof(int*)。a,&a的地址是一样的,但意思不一样,
6、 a 是数组首地址,也就是a0 的地址, &a是对象 ( 数组 ) 首地址, a+1是数组下一元素的地址,即a1,&a+1是下一个对象的地址,即a5 。11. 交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3; 答:有两种解法, 一种用算术算法, 一种用 ( 异或 ) a = a + b; b = a - b; a = a - b; or a = ab;/ 只能对 int,char. b = ab; a = ab; or a = b = a; 12. 列举几种进程的同步机制,并比较其优缺点。答:原子操作、信号量机制、自旋锁、管程、会合、分布式系统名师资料总结 - -
7、 -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 44 页 - - - - - - - - - 13. 进程死锁的原因和4 个必要条件答:资源竞争及进程推进顺序非法;互斥、请求保持、不可剥夺、环路14. 要对绝对地址0 x100000赋值,我们可以用(unsigned int*)0 x100000 = 1234; 那么要是想让程序跳转到绝对地址是0 x100000去执行,应该怎么做?答: *(void (*)( )0 x100000 ) ( ); 首 先 要 将0 x100000强 制 转 换
8、 成 函 数 指 针 , 即 : (void (*)()0 x100000。 然 后 再 调 用 它 : *(void (*)()0 x100000)(); 用 typedef可以看得更直观些: typedef void(*)() voidFuncPtr; *(voidFuncPtr)0 x100000)(); 15. unsigned char *p1; unsigned long *p2; p1=(unsigned char *)0 x801000; p2=(unsigned long *)0 x810000; 请问p1+5=_; p2+5=_; 答案: 801005;810014。不要忘
9、记了这个是16 进制的数字, p2 要加 20 变为 16 进制就是14 16 、设有以下说明和定义:typedef union long i; int k5; char c; DATE; struct data int cat; DATE cow; double dog; too; DATE max; 则语句printf(%d,sizeof(too)+sizeof(max);的执行结果是:_ 答: DATE 是一个union, 变量公用空间 . 里面最大的变量类型是int5, 占用20 个字节 . 所以它的大小是20 data 是一个 struct, 每个变量分开占用空间. 依次为 int4
10、 + DATE20 + double8 = 32. 所以结果是20 + 32 = 52. 当然 . 在某些 16 位编辑器下 , int可能是 2 字节 ,那么结果是int2 + DATE10 + double8 = 20 1. 找错试题 1:Void test1() char string10; char* str1=0123456789; strcpy(string, str1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 44 页 - - - - - - -
11、- - 试题 2:Void test2() char string10, str110; for(I=0; I10;I+) str1i =a; strcpy(string, str1); 试题 3:Void test3(char* str1) char string10; if(strlen(str1) = 10) strcpy(string, str1); 在 swap 函数中, p 是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC+ 中 DEBUG 运行时提示错误“Access Violation”。该程序应该改为:解答:test1: 字符串 str1需要 11 个字节才能存
12、放下( 包括末尾的 0),而 string只有 10 个字节的空间,strcpy会导致数组越界test2: 如果面试者指出字符数组str1不能在数组内结束可以给3 分;如果面试者指出strcpy(string, str1)调用使得从 str1内存起复制到string内存起所复制的字节数具有不确定性可以给7 分, 在此基础上指出库函数strcpy工作方式的给10 分test3: if(strlen(str1) = 10)应改为 if(strlen(str1) = - EPSINON) & (x =”或“ =”形式。如果写成if (x = 0.0),则判为错,得0 分。试题 2:以下为 Windo
13、ws NT 下的 32 位 C+程序,请计算sizeof的值void Func ( char str100 ) sizeof( str ) = ? void *p = malloc( 100 ); sizeof ( p ) = ? 解答:sizeof( str ) = 4 sizeof ( p ) = 4 剖析:Func ( char str100 )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。数组名的本质如下:(1) 数组名指代一种数据结构,这种数据结构就是数组;例如:char
14、 str10; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 44 页 - - - - - - - - - cout sizeof(str) endl; 输出结果为10,str指代数据结构char10。(2) 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;char str10; str+; /编译出错,提示str不是左值(3) 数组名作为函数形参时,沦为普通指针。Windows NT 32 位平台下,指针的长度(占用内存的
15、大小)为4 字节,故sizeof( str ) 、sizeof ( p ) 都为 4。试题 3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?least = MIN(*p+, b); 解答:#define MIN(A,B) (A) = (B) ? (A) : (B) MIN(*p+, b)会产生宏的副作用剖析:这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:(1
16、) 谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:#define MIN(A,B) (A) = (B) ? (A) : (B) #define MIN(A,B) (A = B ? A : B ) 都应判 0 分;(2) 防止宏的副作用。宏定义 #define MIN(A,B) (A) = (B) ? (A) : (B) 对 MIN(*p+, b) 的作用结果是:(*p+) = (b) ? (*p+) : (*p+) 这个表达式会产生副作用,指针 p 会作三次 +自增操作。 除此之外, 另一个应该判0 分的解答是: #define MIN(A,B) (A) = (B
17、) ? (A) : (B); 这个解答在宏定义的后面加“; ”,显示编写者对宏的概念模糊不清,只能被无情地判0 分并被面试官淘汰。试题 4:为什么标准头文件都有类似以下的结构?#ifndef _INCvxWorksh #define _INCvxWorksh #ifdef _cplusplus 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 44 页 - - - - - - - - - extern C #endif /* */ #ifdef _cplusplus #en
18、dif #endif /* _INCvxWorksh */ 解答:头文件中的编译宏#ifndef _INCvxWorksh #define _INCvxWorksh #endif 的作用是防止被重复引用。作为一种面向对象的语言,C+ 支持函数重载,而过程式语言C则不支持。函数被C+ 编译后在symbol 库中的名字与 C语言的不同。例如,假设某个函数的原型为:void foo(int x, int y); 该函数被C 编译器编译后在symbol 库中的名字为_foo ,而C+编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信
19、息,C+就是考这种机制来实现函数重载的。为了实现C 和 C+ 的混合编程,C+ 提供了C连接交换指定符号extern C来解决名字匹配问题,函数声明前加上extern C后,则编译器就会按照C语言的方式将该函数编译为_foo ,这样 C语言中就可以调用C+的函数了。试题 5:编写一个函数,作用是把一个char 组成的字符串循环右移n 个。比如原来是“ abcdefghi ”如果n=2,移位后应该是“ hiabcdefgh ”函数头是这样的:/pStr是指向以 0结尾的字符串的指针/steps是要求移动的n void LoopMove ( char * pStr, int steps ) / 请
20、填充 . 解答:正确解答1:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 44 页 - - - - - - - - - 正确解答1:void LoopMove ( char *pStr, int steps ) int n = strlen( pStr ) - steps; char tmpMAX_LEN; strcpy ( tmp, pStr + n ); strcpy ( tmp + steps, pStr); *( tmp + strlen ( pStr ) )
21、 = 0; strcpy( pStr, tmp ); 正确解答2:void LoopMove ( char *pStr, int steps ) int n = strlen( pStr ) - steps; char tmpMAX_LEN; memcpy( tmp, pStr + n, steps ); memcpy(pStr + steps, pStr, n ); memcpy(pStr, tmp, steps ); 剖析:这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。最频繁被使用的库函数包括:(1) strcpy (2) memc
22、py (3) memset 试题 6:已知 WAV 文件格式如下表,打开一个WAV 文件,以适当的数据结构组织WAV 文件头并解析WAV 格式的各项信息。WAVE 文件格式说明表偏移地址字节数数据类型内 容文件头00H 4 Char RIFF标志04H 4 int32 文件长度08H 4 Char WAVE 标志0CH 4 Char fmt标志10H 4 过渡字节(不定)14H 2 int16 格式类别16H 2 int16 通道数18H 2 int16 采样率(每秒样本数),表示每个通道的播放速度名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
23、 - - - - 名师精心整理 - - - - - - - 第 11 页,共 44 页 - - - - - - - - - 1CH 4 int32 波形音频数据传送速率20H 2 int16 数据块的调整数(按字节算的)22H 2 每样本的数据位数24H 4 Char 数据标记符 data 28H 4 int32 语音数据的长度解答:将 WAV 文件格式定义为结构体WAVEFORMAT:typedef struct tagWaveFormat char cRiffFlag4; UIN32 nFileLen; char cWaveFlag4; char cFmtFlag4; char cTran
24、sition4; UIN16 nFormatTag ; UIN16 nChannels; UIN16 nSamplesPerSec; UIN32 nAvgBytesperSec; UIN16 nBlockAlign; UIN16 nBitNumPerSample; char cDataFlag4; UIN16 nAudioLength; WAVEFORMAT; 假设 WAV 文件内容读出后存放在指针buffer开始的内存单元内,则分析文件格式的代码很简单,为:WAVEFORMAT waveFormat; memcpy( &waveFormat, buffer,sizeof( WAVEFORMA
25、T ) ); 直接通过访问waveFormat 的成员,就可以获得特定WAV 文件的各项格式信息。剖析:试题 6 考查面试者组织数据结构的能力,有经验的程序设计者将属于一个整体的数据成员组织为一个结构体,利用指针类型转换,可以将memcpy 、memset等函数直接用于结构体地址,进行结构体的整体操作。透过这个题可以看出面试者的程序设计经验是否丰富。试题 7:编写类 String的构造函数、析构函数和赋值函数,已知类String的原型为:class String public: String(const char *str = NULL); / 普通构造函数名师资料总结 - - -精品资料欢迎
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年史上最全的IT公司面试题知识 2022 年史上最全 IT 公司 试题 知识
限制150内