
C/C++经典面试题
一步两步先生
这个作者很懒,什么都没留下…
展开
-
面试题9——简述C,C++程序编译的内存分配情况
一个C,C++程序编译时内存分为5大存储区:堆区,栈区,全局区,文字常量区,程序代码区。C,C++中内存分配方式可以分为三种:(1)从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量等。(2)在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指...原创 2018-12-07 20:15:19 · 1974 阅读 · 1 评论 -
面试题18——链表和数组有什么区别
数组和链表有以下不同:(1)存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个节点要保存相邻结点指针;(2)数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低;(3)数据插入或删除:链表可以快速插入和删除结点,而数组则可能需要大量数据移动;(4)越界问题:链表不存在越界问题,数组有越界问题。数组便于查询,...原创 2018-12-08 13:32:38 · 3518 阅读 · 0 评论 -
面试题19——怎样把一个单链表反序
(1)反转一个链表。循环算法:List reverse(List n){ if(!n) //判断链表是否为空,为空退出 { return n; } list cur=n.next; //保存头结点的下个节点 list pre=n; //保存头结点 list tmp; pre.next=NULL; //头结点的指针指空,转换后变尾结点;...原创 2018-12-08 13:46:29 · 1031 阅读 · 0 评论 -
面试题20——计算一颗二叉树的深度
深度计算函数:int depth(BSTree T){ if(!T) { return 0; } int d1=depth(T->lchild); int d2=depth(T->rchild); return (d1>d2?d1:d2)+1;}原创 2018-12-08 13:51:52 · 1207 阅读 · 0 评论 -
面试题21——编码实现直接插入排序,shell排序,冒泡排序,直接选择排序
#include<iostream>void insertsort(int *arr,int len){ int i,j,tmp; for(i=1;i<len;++i) { tmp=arr[i]; for(j=i-1;i>=0;--j) { if(tmp>arr[j]) { arr[j+1]=原创 2018-12-08 14:00:24 · 384 阅读 · 0 评论 -
面试题22——编码实现堆排,归并排序,基数排序
堆排(大根堆):void adjust(int*arr,int start,int end){ int tmp=arr[start]; for(int i=2*start+1;i<=end;i=2*i+1) { if(i<end&&arr[i]<arr[i+1]) { i++; } if(arr[i]>tmp) { ...原创 2018-12-08 20:30:23 · 292 阅读 · 0 评论 -
面试题23——编码实现快速排序及其三种优化
快速排序:int Partation(int *arr,int low,int hign){ int tmp; tmp=arr[low]; while(low<hign) { while((low<hign)&&arr[hign]>=tmp) { hign--; } if(low>=hign) { break; ...原创 2018-12-08 21:54:11 · 327 阅读 · 0 评论 -
面试题24——C++的引用和C语言的指针有什么区别
C++的引用和C语言的指针有以下区别:(1)引用必须初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。引用较比指针更加安全;(2)引用指向一块特定的内存,不能被更改。不存在指向空值的引用,但是存在指向空值的指针。指针可指向任意一块内存,可以改变所指的对象;(3)指针的大小确定,引用的大小根据所引用的类型确定;(4)指针使用时必须解引用;(5)定义一个指针和引...原创 2018-12-08 22:10:19 · 2116 阅读 · 1 评论 -
面试题25——typedef和define有什么区别
(1)用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义常量,以及书写复杂使用频繁的宏。(2)执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。(3)作用域不同:typedef 有作用域限定。define 不受作用域约束,...原创 2018-12-09 10:23:06 · 795 阅读 · 0 评论 -
面试题26——简述指针常量和常量指针的区别?关键字const是什么?static有什么作用?extern有什么作用?
指针常量是指定义了一个指针,这个指针的值只能在定义时初始化,其他地方不能改变。常量指针是指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针来改变这个对象的值。指针常量强调的是指针的不可改变性,而常量指针强调的是指针对其所指对象的不可改变性。const 用来定义一个只读的变量或对象。主要优点:便于类型检查、同宏定义一样可以方便地进行参数的修改和调整、节省空间,避免不必要的内存分配...原创 2018-12-09 10:40:17 · 581 阅读 · 0 评论 -
面试题27——野指针产生的原因和避免方法
情况一原因 指针变量声明时没有被初始化。解决办法 指针声明时初始化,可以是具体的地址值,也可让它指向NULL。情况二原因 指针 p 被 free 或者 delete 之后,没有置为 NULL。解决办法 指针指向的内存空间被释放后指针应该指向NULL。情况三原因 指针操作超越了变量的作用范围。解决办法 在变量的作用域结束前释放掉变量的地址空间并且让指针指向NULL。注意“野指针”...原创 2018-12-09 10:44:24 · 497 阅读 · 1 评论 -
面试题28——编码实现字符串转化为数字,数字转化为字符串
字符串转化为数字:int my_Atoi(const char*str){ assert(str!=NULL) if(str==NULL) { return NULL; } while(*str==' ') { str++; } if(*str=='+') { str++; } if(*str=='-') { printf("-"); str++;...原创 2018-12-09 23:46:56 · 1411 阅读 · 0 评论 -
面试题29——构造函数能否成为虚函数
构造函数不能是虚函数。而且不能在构造函数中调用虚函数,因为那样实际执行的是父类的对应函数,因为自己还没有构造好。析构函数可以是虚函数,而且,在一个复杂类结构中,这往往是必须的。析构函数也可以是纯虚函数,但纯虚析构函数必须有定义体,因为析构函数的调用是在子类中隐含的。说明:虚函数的动态绑定特性是实现重载的关键技术,动态绑定根据实际的调用情况查询相应类的虚函数表,调用相应的虚函数。...原创 2018-12-09 23:53:35 · 549 阅读 · 0 评论 -
面试题30——谈谈对面向对象的认识
面向对象可以理解成对待每一个问题,都是首先要确定这个问题由几个部分组成,而每一个部分其实就是一个对象。然后再分别设计这些对象,最后得到整个程序。传统的程序设计多是基于功能的思想来进行考虑和设计的,而面向对象的程序设计则是基于对象的角度来考虑问题。这样做能够使得程序更加的简洁清晰。说明:编程中接触最多的“面向对象编程技术”仅仅是面向对象技术中的一个组成部分。发挥面向对象技术的优势是一个综合的技术问...原创 2018-12-09 23:55:29 · 2011 阅读 · 0 评论 -
面试题17——简述多态实现的原理
编译器发现一个类中有虚函数,便会立即为此类生成虚函数表vtable。虚函数表的各表项为指向对应虚函数的指针。编译器还会为此类中隐含插入一个指针vptr(对vc编译器说,它插在类的第一位置上)指向虚函数表。调用此类的构造函数时,在类的构造函数中,编译器会隐含执行vptr与vtable的关联代码,将vptr指向相应的vtable,将类与此类的vtable联系起来。另外在调用类的构造函数时,指向基础类的...原创 2018-12-08 13:24:33 · 1317 阅读 · 0 评论 -
面试题16——简述类成员函数的重写,重载和隐藏的区别
重写与重载主要有以下不同:(1)范围的区别:被重写的和重写的函数在两个类中,而重载和被重载的函数在同一个类中;(2)参数的区别:被重写函数和重写函数的参数列表一定相同,而被重载函数和重载函数的参数列表一定不同;(3)virtual的区别:重写的基类中被重写的函数必须要有virtual修饰,而重载函数和被重载函数可以被virtual修饰,也可以没有隐藏和重写,重载有以下不同:(1)与重载的...原创 2018-12-08 12:45:03 · 904 阅读 · 0 评论 -
面试题15——用C++设计一个不能被继承的类
template &lt;typename T&gt;class A{ friend T;private: A(){} ~A(){}};class B:virtual public A&lt;B&gt;{public: B(){} ~B(){}};class C:virtual public B{public: C(){} ~C(){}};void ma..原创 2018-12-08 09:34:44 · 276 阅读 · 0 评论 -
面试题1——变量的声明和定义有什么区别?
为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只能在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。...原创 2018-12-06 23:27:32 · 4617 阅读 · 0 评论 -
面试题2——写出bool,int ,float,指针变量与“零值”比较的if语句
bool型数据if(flag){ A;}else{ B;}int型数据if(0!=flag){ A;}else{ B;}指针型数据if(NULL==flag){ A;}else{ B;}float型数据if((flag&amp;gt;=NORM)&amp;amp;&amp;amp;(FLAG&amp;lt;=NORM))原创 2018-12-06 23:36:30 · 1708 阅读 · 0 评论 -
面试题3——sizeof和strlen的区别
sizeof和strlen有如下区别:(1)sizeof是一个操作符,strlen是库函数;(2)sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为’\0’的字符串做参数;(3)编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度;(4)数组做s...原创 2018-12-06 23:49:19 · 1695 阅读 · 0 评论 -
面试题4——C语言的关键字static和C++的关键字static有什么区别?
在C中static用来修饰局部静态变量和外部静态变量、函数。而C++中除了以上功能之外,还可以用来定义类的成员变量和函数。即静态成员和静态成员函数。编程时static的记忆性和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而C++的静态成员则可以在多个对象实例间进行通信,传递信息。...原创 2018-12-06 23:54:26 · 956 阅读 · 0 评论 -
面试题5——C中的malloc和C++中的new有什么区别?
malloc和new有以下区别:(1)new,delete是操作符,只能在C++中使用;(2)malloc,free是函数,可以覆盖,C,C++中都可以使用;(3)new可以调用对象的构造函数,对应的delete调用相应的析构函数;(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数;(5) malloc/free需要手动计算类型大小且返回值为void*,new/...原创 2018-12-07 00:15:31 · 2623 阅读 · 0 评论 -
面试题6——写一个“标准”宏MIN和MAX
MIN#define min(a,b)((a)&lt;=(b)?(a):(b))在调用时应注意这个宏定义的副作用,如下调用:(++*p)&lt;=(x)?(++*p):(x)p指针自加了两次,违背MIN本意MAX#define max(a,b)((a)&gt;=(b)?(a):(b))...原创 2018-12-07 00:21:32 · 4031 阅读 · 0 评论 -
面试题7——一个指针可以是volatile吗?
可以。因为指针和普通变量一样,有事也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰指针。指针是一种普通的变量,从访问上没有什么不同于其他变量的特性。其保存的数值是个整形数据,和整型变量不同的是,这个整型数据指向的是一段内存地址。...原创 2018-12-07 00:32:22 · 5444 阅读 · 0 评论 -
面试题8——a和&a有什么区别?
例:void main(){ int a[5]={1,2,3,4,5}; int*ptr=(int*)(&amp;a+1); printf("%d,%d",*(a+1),*(ptr-1));}输出结果为:2,5;数组名a可以作数组的首地址,而&amp;a是数组的指针。当intptr=(int)(&amp;a+1)改为intptr=(int)(a+1)时,输出结果为:1...原创 2018-12-07 00:39:20 · 450 阅读 · 0 评论 -
面试题10——简述strcpy,sprintf,memcpy的区别
三者主要有一下不同之处:(1)操作对象不同:strcpy的两个操作对象均是字符串sprintf的操作源对象可以是多种数据类型,目的操作对象是字符串memcpy的两个对象就是两个人一可操作的内存地址,不限于何种数据类型。(2)执行效率不同:memcpy最高,strcpy次之,sprintf效率最低。(3)实现功能不同:strcpy主要实现字符串变量间的拷贝sprintf主要实现其他...原创 2018-12-07 20:25:09 · 768 阅读 · 0 评论 -
面试题 11——设置地址为 0x67a9 的整型变量的值为 0xaa66
强制类型转换的典型例子,无论在什么平台地址长度和整形数据的长度是一样的。即一个整型数据可以转换成地址指针类型,只需确保有意义即可。int *ptr=(int*)0x67a9;*ptr=0xaa66;...原创 2018-12-07 20:30:56 · 3221 阅读 · 0 评论 -
面试题12——面向对象的三大特性
面向对象的三大特征:封装性,继承性,多态性(1)封装性:将客观事物抽象成类,每个类对自身的数据和方法实行保护(protected,private,public)(2)继承性:广义的继承有三种实现形式:a,实现继承(使用基类的属性和方法而无需额外编码的能力)b,可视继承(子窗体使用父窗体的外观和实现代码)c,接口继承(仅使用属性和方法,实现滞后到子类实现)(3)多态性:是将父类对象设...原创 2018-12-07 20:53:26 · 1163 阅读 · 0 评论 -
面试题13——C++空类有哪些成员函数
缺省构造函数缺省拷贝构造函数缺省析构函数缺省赋值运算符缺省取址运算符缺省取址运算符 const原创 2018-12-07 20:56:22 · 1017 阅读 · 0 评论 -
面试题14——谈谈对拷贝构造函数和赋值运算符的认识
拷贝构造函数和赋值运算符重载有以下两个不同之处:(1)拷贝构造函数生成新的类对象,赋值运算符不能;(2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不需要检测原对象是否和新建对象相同,而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉当类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不能使用默认的。...原创 2018-12-07 21:02:23 · 624 阅读 · 0 评论 -
static在C/C++中的区别和用法
static主要有三个作用:(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数前两种C和C++都有,第三种仅在C++中有,下面分别作以下介绍:一、局部静态变量在C/C++中, 局部变量按照存储形式可分为三种auto, static, register。其中register不常用到,下面主要说说auto和static的区别。存储空间分配和生存周期不同auto类型...原创 2019-04-09 14:12:00 · 649 阅读 · 2 评论