ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:22.79KB ,
资源ID:4031987      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4031987.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C和C++经典面试题.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C和C++经典面试题.docx

1、C和C+经典面试题C/C+经典面试题(面试必备)面试题 1:变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入 extern 修饰的是变量的声明, 说明此变量将在文件以外或在文件后面部分定义。说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。 面试题 2:写出 bool 、 int、 float、指针变量与“零值” 比较的 if 语句bool 型数据:if( flag )A;elseB;int 型数据:if( 0 != flag )A;elseB;指针型数:i

2、f( NULL = flag )A;elseB;float 型数据:if ( ( flag = NORM ) & ( flag = NORM ) )A; 2注意:应特别注意在 int、指针型变量和“零值”比较的时候,把“零值”放在左边,这样当把“ =”误写成“ =”时,编译器可以报错,否则这种逻辑错误不容易发现,并且可能导致很严重的后果。 面试题 3: sizeof 和 strlen 的区别sizeof 和 strlen 有以下区别:?是一个操作符,?是库函数。?的参数可以是数据的类型,也可以是变量,而?只能以结尾为0的字符串作参数。?编译器在编译时就计算出了 sizeof 的结果。而 str

3、len 函数必须在运行时才能计算出来。并且 sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。?数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是 sizeof。面试题 4: C 语言的关键字 static 和 C+ 的关键字 static 有什么区别在 C 中 static 用来修饰局部静态变量和外部静态变量、函数。而 C+中除了上述功能外,还用来定义类的成

4、员变量和函数。即静态成员和静态成员函数。注意:编程时 static 的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而 C+的静态成员则可以在多个对象实例间进行通信,传递信息。面试题 5: 中的 malloc 和中的 new 有什么区别malloc 和 new 有以下不同:( 1) new、 delete 是操作符,可以重载,只能在 C+中使用。( 2) malloc、 free 是函数,可以覆盖, C、 C+中都可以使用。( 3) new 可以调用对象的构造函数,对应的 delete 调用相应的析构函数。( 4) malloc 仅仅分配内存, free 仅仅回收内存,并

5、不执行构造和析构函数( 5) new、 delete 返回的是某种数据类型指针, malloc、 free 返回的是 void 指针。注意: malloc 申请的内存空间要用 free 释放,而 new 申请的内存空间要用 delete 释放,不要混用。因为两者实现的机理不同。 面试题 6: 写一个“ 标准” 宏 MIN#define min(a,b)(a)=(b)?(a):(b)注意:在调用时一定要注意这个宏定义的副作用,如下调用:(+*p)=(x)?(+*p):(x)。p 指针就自加了两次,违背了 MIN 的本意。3 面试题 7: 一个指针可以是 volatile 吗可以,因为指针和普通变

6、量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个 buffer 的指针时,必须用 volatile 来修饰这个指针。说明:指针是一种普通的变量,从访问上没有什么不同于其他变量的特性。其保存的数值是个整型数据,和整型变量不同的是,这个整型数据指向的是一段内存地址。 面试题 8: a 和&a 有什么区别请写出以下代码的打印结果,主要目的是考察 a 和&a 的区别。#includevoid main( void )int a5=1,2,3,4,5;int *ptr=(int *)(&a+1);printf(%d,%d,*(a+1),*(ptr-1);return;输出结果

7、: 2, 5。注意:数组名 a 可以作数组的首地址,而&a 是数组的指针。思考,将原式的 int *ptr=(int *)(&a+1);改为 int *ptr=(int *)(a+1);时输出结果将是什么呢? 面试题 9: 简述 C、 C+程序编译的内存分配情况C、 C+中内存分配方式可以分为三种:( 1) 从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。 速度快、 不容易出错,因为有系统会善后。 例如全局变量, static 变量等。( 2) 在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配

8、运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。( 3) 从堆上分配:即动态内存分配。程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活。 如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏, 另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。一个 C、 C+程序编译时内存分为 5 大存储区:堆区、栈区、全局区、文字常量区、程序代码区。4 面试题 10: 简述 strcpy、 sprintf 与 memcpy 的区别三者主要有以下不同之处:(

9、 1) 操作对象不同, strcpy 的两个操作对象均为字符串, sprintf 的操作源对象可以是多种数据类型,目的操作对象是字符串, memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。( 2) 执行效率不同, memcpy 最高, strcpy 次之, sprintf 的效率最低。( 3) 实现功能不同, strcpy 主要实现字符串变量间的拷贝, sprintf 主要实现其他数据类型格式到字符串的转化, memcpy 主要是内存块间的拷贝。说明: strcpy、 sprintf 与 memcpy 都可以实现拷贝的功能,但是针对的对象不同,根据实际需求,来选择合适

10、的函数实现拷贝功能。 面试题 11: 设置地址为 0x67a9 的整型变量的值为 0xaa66int *ptr;ptr = (int *)0x67a9;*ptr = 0xaa66;说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长度和整型数据的长度是一样的,即一个整型数据可以强制转换成地址指针类型,只要有意义即可。 面试题 12: 面向对象的三大特征面向对象的三大特征是封装性、继承性和多态性:?封装性:将客观事物抽象成类,每个类对自身的数据和方法实行 protection( private, protected,public)。?继承性:广义的继承有三种实现形式: 实现继承( 使用基

11、类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。?多态性:是将父类对象设置成为和一个或更多它的子对象相等的技术。用子类对象给父类对象赋值之后,父类对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。说明:面向对象的三个特征是实现面向对象技术的关键,每一个特征的相关技术都非常的复杂,程序员应该多看、多练。 面试题 13: C+的空类有哪些成员函数?缺省构造函数。?缺省拷贝构造函数。?缺省析构函数。?缺省赋值运算符。?缺省取址运算符。?缺省取址运算符 const。注意:有些书上只是简单的介绍了前四个函数。没

12、有提及后面这两个函数。但后面这两个函数也是空类的默认函数。另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们。5 面试题 14: 谈谈你对拷贝构造函数和赋值运算符的认识拷贝构造函数和赋值运算符重载有以下两个不同之处:( 1)拷贝构造函数生成新的类对象,而赋值运算符不能。( 2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认的。 面试题 15: 用 C+设计

13、一个不能被继承的类template class Afriend T;private:A() A() ;class B : virtual public Apublic:B() B() ;class C : virtual public Bpublic:C() C() ;void main( void )B b;n);9return NULL; S-data = 0; n);return S;if( NULL = S-next)p-next = NULL;elsep-next = S-next; p-data = data; LEN自下向上扫描if( ARRAYj+1 0)d /= 10;tem

14、p +;if( temp m )m = temp;temp = 0;return m;QueueLink Push( QueueLink &Q , node node ) ata);printf(n);Max = lenData( Array, LEN ); ata /power - (Arrayi.data/(power * d) * d;Push( Queuek, Arrayi );for(int l = 0, k = 0; l next = NULL;树结点入栈函数:void push_path(pPath H, pBTree T)pPath p = H-next;pPath q = H

15、;while( NULL != p )20q = p;p = p-next;p = ( pPath )malloc( sizeof( PATH ) ); /申请新结点p-next = NULL; /初始化新结点p-tree = T;q-next = p; /新结点入栈树结点打印函数:void print_path( pPath L )pPath p = L-next;while( NULL != p ) /打印当前栈中所有数据printf(%d, , p-tree-data);p = p-next;树结点出栈函数:void pop_path( pPath H )pPath p = H-next

16、;pPath q = H;if( NULL = p ) /检验当前栈是否为空printf(Stack is null!n);return;p = p-next;while( NULL != p ) /出栈q = q-next;p = p-next;free( q-next ); /释放出栈结点空间q-next = NULL;判断结点是否为叶子结点:int IsLeaf(pBTree T)return ( T-lchild = NULL )&( T-rchild=NULL );查找符合条件的路径:int find_path(pBTree T, int sum, pPath L)21push_pa

17、th( L, T);record += T-data;if( ( record = sum ) & ( IsLeaf( T ) ) ) /打印符合条件的当前路径print_path( L );printf( n );if( T-lchild != NULL ) /递归查找当前节点的左孩子find_path( T-lchild, sum, L);if( T-rchild != NULL ) /递归查找当前节点的右孩子find_path( T-rchild, sum, L);record -= T-data;pop_path(L);return 0;注意:数据结构一定要活学活用,例如本题,把所有的

18、结点都压入栈,而不符合条件的结点弹出栈,很容易实现了有效路径的查找。虽然用链表也可以实现,但是用栈更利于理解这个问题,即适当的数据结构为更好的算法设计提供了有利的条件。 面试题 34: 写一个“标准” 宏 MIN写一个“标准”宏 MIN,这个宏输入两个参数并且返回较小的一个。【 答案】#define min(a,b)(a)=(b)?(a):(b)注意:在调用时一定要注意这个宏定义的副作用,如下调用:(+*p)和经常连续使用。因此这两个操作符的返回值应该是一个仍旧支持这两个操作符的流引用。其他的数据类型都无法做到这一点。注意:除了在赋值操作符和流操作符之外的其他的一些操作符中, 如+、 -、 *

19、、 /等却千万不能返回引用。因为这四个操作符的对象都是右值,因此,它们必须构造一个对象作为返回值。 面试题 40: 简述指针常量与常量指针区别指针常量是指定义了一个指针,这个指针的值只能在定义时初始化,其他地方不能改变。常量指针是指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针来改变这个对象的值。指针常量强调的是指针的不可改变性,而常量指针强调的是指针对其所指对象的不可改变性。注意:无论是指针常量还是常量指针,其最大的用途就是作为函数的形式参数,保证实参在被调用函数中的不可改变特性。 面试题 41: 数组名和指针的区别请写出以下代码的打印结果:#include #include

20、void main(void)char str13=Hello world!;23char *pStr=Hello world!;coutsizeof(str)endl;coutsizeof(pStr)endl;coutstrlen(str)endl;coutstrlen(pStr)endl;return;【答案】打印结果:1341212注意:一定要记得数组名并不是真正意义上的指针,它的内涵要比指针丰富的多。但是当数组名当做参数传递给函数后,其失去原来的含义,变作普通的指针。另外要注意 sizeof 不是函数,只是操作符。 面试题 42: 如何避免“野指针”“野指针”产生原因及解决办法如下:(

21、 1) 指针变量声明时没有被初始化。 解决办法:指针声明时初始化,可以是具体的地址值,也可让它指向 NULL。( 2) 指针 p 被 free 或者 delete 之后, 没有置为 NULL。解决办法:指针指向的内存空间被释放后指针应该指向 NULL。( 3) 指针操作超越了变量的作用范围。解决办法:在变量的作用域结束前释放掉变量的地址空间并且让指针指向 NULL。注意:“野指针”的解决方法也是编程规范的基本原则,平时使用指针时一定要避免产生“野指针”,在使用指针前一定要检验指针的合法性。 面试题 43: 常引用有什么作用常引用的引入主要是为了避免使用变量的引用时,在不知情的情况下改变变量的值

22、。常引用主要用于定义一个普通变量的只读属性的别名、作为函数的传入形参,避免实参在调用函数中被意外的改变。说明:很多情况下,需要用常引用做形参,被引用对象等效于常对象, 不能在函数中改变实参的值,这样的好处是有较高的易读性和较小的出错率。 面试题 44: 编码实现字符串转化为数字编码实现函数 atoi(), 设计一个程序,把一个字符串转化为一个整型数值。例如数字:“ 5486321”,转化成字符: 5486321。【答案】int myAtoi(const char * str)24int num = 0; /保存转换后的数值int isNegative = 0; /记录字符串中是否有负号int n =0;char *p = str;if(p = NULL) /判断指针的合法性return -1;while(*p+ != 0) /计算数字符串度n+;p = str;if(p0 = -) /判断数组是否有负号isNegative = 1;char temp = 0;for(int i = 0 ; i n; i+)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1