2020年度C和C经典面试题面试必备.docx

上传人:无*** 文档编号:64499058 上传时间:2022-11-29 格式:DOCX 页数:54 大小:35.02KB
返回 下载 相关 举报
2020年度C和C经典面试题面试必备.docx_第1页
第1页 / 共54页
2020年度C和C经典面试题面试必备.docx_第2页
第2页 / 共54页
点击查看更多>>
资源描述

《2020年度C和C经典面试题面试必备.docx》由会员分享,可在线阅读,更多相关《2020年度C和C经典面试题面试必备.docx(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

2、LL = flag )A;)elseB;)float型数据:if ( ( flag = NORM ) & ( flag free 返回的是void指针。注意:malloc申请的内存空间要用free释放,而new申请的内 存空间要用delete释放,不要混用。因为两者实现的机理不同。面试题6:写一个“标准”宏MIN#def i ne min (a, b) (a) = (b) ? (a): (b)注意:在调用时一定要注意这个宏定义的副作用,如下调用:(+*p)=(x)?(+*p):(x)oP指针就自加了两次,违背了 MIN的本意。3面试题,7Z 个指针能够是volatile吗能够,因为指针和普通变

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

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

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

6、作源对象能够是多种数据类型,目的操作对象是字符串,memcpy的两个对象就是两个任意可操作的 内存地址,并不限于何种数据类型。(2)执行效率不同,memcpy最高,strcpy次之,sprintf的 效率最低。(3)实现功能不同,strcpy主要实现字符串变量间的拷贝, sprintf主要实现其它数据类型格式到字符串的转化,memcpy主要是内存块间的拷贝。说明:strcpy、sprintf与memcpy都能够实现拷贝的功能,可是 针正确对象不同,根据实际需求,来选择合适的函数实现拷贝功能。面试题11:设置地址为0x67a9的整型变量的值为0xaa66int *ptr;ptr = (int *

7、)0x67a9;*ptr = 0xaa66;说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长 度和整型数据的长度是样的,即个整型数据能够强制转换成地址指针类型,只要有意义即可。面 试题12:面向对象的三大特征面向对象的三大特征是封装性、继承性和多态性: 封装性:将客观事物抽象成类,每个类对自身的数据和方法实行 protection ( private, protected,public)继承性:广义的继承有三种实现形式:实现继承(使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现) 多态性:是将父

8、类对象设置成为和一个或更多它的子对象相等的技术。用子类对象给父类对象赋值之后,父类对象就能够根据当前赋值给它的子对象的特性以不同的方 式运作。说明:面向对象的三个特征是实现面向对象技术的关键,每个特征 的相关技术都非常的复杂,程序员应该多看、多练。面试题13: C+的空类有哪些成员函数口缺省构造函数。缺省拷贝构造函数。 缺省析构函数。 缺省赋值运算符。缺省取址运算符。 缺省取址运算符const 注意:有些书上只是简单的介绍了前四个函数。没有提及后面这两个函数。但后面这两个函数也是空类的默认函数。另外需要注意的是,只有当实际使用这些函数的时 候,编译器才会去定义它们。5面试题14:谈谈你对拷贝构

9、造函数和赋值运算符的认识拷贝构造函数和赋值运算符重载有以下两个不同之处:(1)拷贝构造函数生成新的类对象,而赋值运算符不能。(2)由于拷贝构造函数是直接构造个新的类对象,因此在初始化 这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算 中如果原来的对象中有内存分配要先把内存释放掉注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数 和赋值运算符,不要使用默认的。面试题15:用C+设计个不能被继承的类temp I ate class A(friend T;private:AO )A() );class B : virtual pub Iic A pub

10、 Iic:B0 )B() );class C : virtual pub Iic B(pub Iic:CO )C() ();void main( void )(B b;/C c;return;)注意:构造函数是继承实现的关键,每次子类对象构造时,首先调用的是父类的构造函数,然后是自己的。面试题16:访问基类的私有虚函数写出以下程序的输出结果:#include class Avirtual void g() cout A:g endl;private:virtual void f ()cout A: endl;);class B : public Avoid g()cout B:g endl;v

11、irtual void h()cout B:h endl;); typedef void( *Fun )( void );void main()B b;Fun pFun;for(int i = 0 ; i next; 记录上次翻转后的链表 I dL i st- next = newHead; 将当前结点插入到翻转后链表的开头newHead = I dL i st; 递归处理剩余的链表return ( next=NULL ) ? newHead: reverse ( t, newHead );)说明:循环算法就是图10. 2图!0.5的移动过程,比较好理解和 想到。递归算法的设计虽有一点难度,可

12、是理解了循环算法,再设计递归算法就简单多了。面试题21 :简述队列和栈的异同队列和栈都是线性存储结构,可是两者的插入和删除数据的操作不同,队列是“先进先出”,栈是“后进先出”。注意:区别栈区和堆区。堆区的存取是顺序随意”,而栈区是后进先出”。栈由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配方 式类似于链表。它与本题中的堆和栈是两回事。堆栈只是种数据结构,而堆区和栈 区是程序的不同内存存储区域。面试题22:能否用两个栈实现个队列的功能结点结构体:typedef struct node(

13、int data;node *next;node, *LinkStack;创立空栈:LinkStack CreateNULLStack( LinkStack &S)S = (LinkStack)malloc( sizeof ( node ); 申请新结点if( NULL = S)(printf(Fai I to ma 11oc a new node. n);9return NULL;) S-data = 0;初始化新结点S-next = NULL;return S;)栈的插入函数:LinkStack Push( LinkStack &S, int data)(if( NULL = S) 检验栈

14、(printf (There no node in stack!);return NULL;)LinkStack p = NULL;p = (L i nkStack) ma I I oc ( s i zeof ( node ); 申请新结点if( NULL = p)(printf(Fai I to ma 11oc a new node. n);return S;)if( NULL = S-next)(p-next = NULL;else (p-next - S-next; P-data = data; 初始化新结点S-next = p; 插入新结点return S;)出栈函数:node Pop

15、( LinkStack &S)node temp;temp, data = 0;temp, next = NULL;if( NULL = S) 检验栈(printf (There no node in stack!); return temp;)temp = *S;10 if( S-next = NULL )pr intf(The stack is NULL, cant pop!n); return temp;)L i nkStack p = S -next; 节点出栈S-next - S-next-next;temp - *p;free( p );p = NULL; return temp;

16、)双栈实现队列的入队函数:LinkStack StackToQueuPush( LinkStack &S, int data) node n;LinkStack SI = NULL;CreateNULLStack( SI ); 创立空栈 whi le( NULL != S-next ) /S 出栈入 S1 (n = Pop ( S );Push( S1, n. data );Push( S1, data ); 新结点入栈whi le( NULL != S1-next ) /S1 出栈入 S(n = Pop ( S1 );Push( S, n. data );)return S;)说明:用两个栈

17、能够实现个队列的功能,那用两个队列能否实现 个队列的功能呢?结果是否定的,因为栈是先进后出,将两个栈连在起,就是先进先出。而队列 是现先进先出,无论多少个连在起都是先进先出,而无法实现先进后出。面试题23:计算颗叉树的深度深度的计算函数:int depth(BiTree T)if(!T) return O;判断当前结点是否为叶子结点11int d1= depth (T- I chi Id); 求当前结点的左孩子树的深度int d2= depth(T-rchi Id); 求当前结点的右孩子树的深度return (d1d2?d1: d2)+1;注意:根据叉树的结构特点,很多算法都能够用递归算法来实

18、现。 面试题24:编码实现直接插入排序直接插入排序编程实现如下:#includevoid main( void )int ARRAY 10 = 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 ;int i, j;for( i = 0; i 10; i+)coutARRAYi*)coutendl;for( i = 2; i = 10; i+ ) 将 ARRAY2,,ARRAYn依次按 序插入 (if(ARRAYi ARRAYU-1) 如果ARRAY1口大于一切有序的数值, ARRAYi将保持原位不动 (ARRAY0 = ARRAYi; 将 ARRAY0看做是哨兵,是 ARRAY口的 副

19、本j = i - 1;do 从右向左在有序区ARRAY 1. 1中查找ARRAY i的插入位置ARRAYj+1 = ARRAY; 将数值大于 ARRAYi记录后移j;whi le( ARRAY0 ARRAYj);ARRAYj+1 =ARRAY0; /ARRAYi插入到正确的位置上)for( i = 0; i 10; i+)(coutARRAYiH)coutend I;)12注意:所有为简化边界条件而引入的附加结点(元素)均可称为 哨兵。引入哨兵后使得查找循环条件的时间大约减少了一半,对于记录数较大的文件节约的时间就相 当可观。类似于排序这样使用频率非常高的算法,要尽可能地减少其运行时间。因此不

20、能把上述算法中的 哨兵视为雕虫小技。面试题25:编码实现冒泡排序冒泡排序编程实现如下:ttinclude ttdefine LEN 10 数组长度void main( void )(int ARRAY10 = 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 ); 待排序数组printf( n);for( int a = 0; a LEN; a+ ) 打印数组内容(printf( %d , ARRAY a);)int i = 0;int j = 0;boo I i sChange; 设定交换标志for( i = 1; i = i; j) 对当前无序区 ARRAY i. LEN自下向上扫

21、描if( ARRAYj+1 ARRAYj)交换记录ARRAY0 = ARRAYj+1; ARRAY0不是哨兵,仅做暂存单元ARRAYj+1 = ARRAYj;ARRAYj = ARRAY0;isChange = 1 ;发生了交换,故将交换标志置为真)printf( n);for( a = 0; a LEN; a+) 打印本次排序后数组内容(printf( %d , ARRAY a);)if( ! isChange ) 本趟排序未发生交换,提前终止算法(break;)printf( n);return;)13面试题26:编码实现直接选择排序 #includestdio. h#define LEN

22、 9 void main( void )(int ARRAY LEN = 5, 6, 8, 2, 4, 1, 9, 3, 7 ); 待序数组pr intf (Before sorted:n);for( int m = 0; m LEN; m+ ) 打印排序前数组(printf ( %d , ARRAYm);for (int i = 1; i = LEN - 1; i +) 选择排序(int t = i - 1;int temp = 0;for (int j = i; j LEN; j+)(if (ARRAYj ARRAYt)(t = j;)if (t != (i - 1)(temp = ARR

23、AYi - 1;ARRAYi - 1 = ARRAYt;ARRAYt = temp;)printf( *n);pr intf (After sorted:n);for( i = 0; i LEN; i+ ) 打印排序后数组(printf( %d , ARRAYi);)printf( n);)注意:在直接选择排序中,具有相同关键码的对象可能会颠倒次序, 因而直接选择排序算法是种不稳定的排序方法。在本例中只是例举了简单的整形数组排序,肯定 不会有什么问题。可是在复杂的数据元素序列组合中,只是根据单一的某个关键值排序,直接选择排序则不保证其稳定性,这是直接选择排序的个弱点。面试题27:编程实现堆排序

24、堆排序编程实现:#include 14 void createHeep(int ARRAY, int sPoint, int Len) 生成大根堆(whiIe( ( 2 * sPoint + 1 ) Len )(int mPoint = 2 * sPoint + 1 ;if ( ( 2 * sPoint + 2 ) Len )(if (ARRAY 2 * sPoint + 1 = 0; i) 将 Hr 0, Lenght-1 建成大根堆(createHeep(ARRAY, i, Len);)for ( i = Len - 1; i 0; i)(int tmpData = ARRAY0; 与最后

25、AiB录交换ARRAY 0 = ARRAYi;ARRAYi = tmpData;createHeep ( ARRAY, 0, i ); 将 H. r 0. i重新调整为大根堆return;int main( void )15(int ARRAY = 5, 4, 7, 3, 9, 1, 6, 8, 2;printf(Before sorted:n): 打印排序前数组内容for ( int i = 0; i 9; i+ )(printf (%d , ARRAYi);printf (n);heepSort( ARRAY, 9 ); 堆排序printf (After sorted:n); 打印排序后数

26、组内容for( i = 0; i 9; i+ )(printf( %d , ARRAYi);)printf( n);return 0;说明:堆排序,虽然实现复杂,可是非常的实用。另外读者可是自己 设计实现小堆排序的算法。虽然和大堆排序的实现过程相似,可是却能够加深对堆排序的记忆和理 解。面试题28:编程实现基数排序# include # include # define LEN 8typedef struct node 队列结点(int data;struct node * next;node, *QueueNode;typedef struct Queue 队列(QueueNode fron

27、t;QueueNode rear;Queue, *QueueL i nk;QueueL i nk CreateNul I Queue ( QueueLink &Q) 创立空队列(Q = NULL;Q = ( QueueLink )ma 11oc ( s i zeof ( Queue );if( NULL = Q )pr intf (Fai I to ma 11oc nulI queue!n);return NULL;)16Q-front = ( QueueNode )ma I Ioc ( s i zeof( node );Q-rear = ( QueueNode )ma I Ioc( s i

28、zeof( node );if( NULL = Q-front | NULL = Q-rear )(printf (Fai I to ma 11oc a new queues fornt or rear!n);return NULL; Q-rear = NULL;Q-f r ont-next= Q-rear;return Q;)int lenData( node data, int len) 计算队列中各结点的数据的最大位数(int m - 0;int temp = 0;int d;for( int i = 0; i 0)(d /= 10;temp +;)if ( temp m )(m - t

29、emp;)temp - 0;)return m;)QueueL i nk Push ( QueueL i nk &Q , node node ) 将数据压入队列(QueueNode p1, p;p =( QueueNode )ma 11oc( s i zeof( node );if( NULL = p )(pr intf (Fai I to ma 11oc a new node!n);return NULL;)p1 = Q-front;whi Ie(p1-next != NULL)(p1 = p1-next;) P-data = node, data;p1-next - p;p-next -

30、Q-rear;17return NULL;)node Pop( QueueLink &Q) 数据出队列(node temp;temp. data = 0;temp, next = NULL;QueueNode p;p = Q-front-next;if( p != Q-rear )temp - *p;-front-next = p-next;free( p );p = NULL;)return temp;)int IsEmpty( QueueLink Q)(if ( Q-front-next = Q-rear )(return 0;)return 1;)int main( void )(int

31、 i = 0;int Max = 0; 记录结点中数据的最大位数int d = 10;int power = 1;int k = 0;node ArrayLEN =450, NULL), 32, NULL), 781, NULL, 57 , NULL组 145, NULL, 613, NULL, 401, NULL, 594, NULL;队列结点数QueueL i nk Queue10;for( i = 0; i 10; i+)CreateNul I Queue ( Queue i ); 初始化队列数组for( i = 0; i LEN; i+)pr intf (%d , Arrayi. da

32、ta);pr intf (n);Max = IenData( Array, LEN ); 计算数组中关键字的最大位数 printf (%dn,Max);18for (int j = 0; j Max; j+) 按位排序if(j = 0) power = 1;else power = power *d;for(i = 0; i LEN; i+)(k = Arrayi. data /power - (Arrayi. data/(power * d) * d;Push( Queuek, Arrayi);)for (int I = 0, k = 0; I d; 1+) 排序后出队列重入数组(whiIe( IsEmpty( QueueI)(Arrayk+ = Pop( QueueI);)for ( int t = 0; t LEN; t+)(pr intf (%d , Ar ray t. data);)pr intf (n);)return 0;)说明:队列为基数排序的实现提供了很大的方便,适当的数据机构能 够减少算法的复杂度,让更多的算法实现更容易。面试题29:谈谈你对编程规范的理解或认识 编程规范可总结为:程序的可行性,可读性、可移植性以及可测试性。 说明:这是编程规范的总纲目,面试者不一定要去背诵上面给出的 那几个例子,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁