面试中常见的C/C++问题集锦

来源:互联网 发布:python web service 编辑:程序博客网 时间:2024/05/24 06:51

下面的问题均是自己在面试中实际遇到的,而且在准备面试的过程中也是网上讨论的很多的面试题。本着人人为我,我为人人的互联网精神,特进行一下简单的整理,方便以后的求职复习,也方便他人进行复习。

下面的总结来源于网络加上自己的理解,深刻的理解下面的问题对自己的C/C++技术修为是很有好处的,不仅仅是应对面试。想要理解的更深刻还是要多去读那些经典的C和C++书籍,如《C++ primer》 《Effective C++》 《高质量C/C++程序设计指南》........

功夫下在平常,自己就是平常就是不好好的看书,许多的问题都不是很清楚,在校园招聘求职时很是被动,就C/C++语言的笔试和面试中答的很是拙计!

持续整理中............................

1.指针和引用的区别

此问题在平常感觉很了解很清楚了,但是被面试官问到时,还是摇了摇头说没有说到本质上去。究竟本质为何?

1>从内存分配上讲,编译器为指针变量分配内存。但是引用变量不会另外分配内存,你可以通俗的理解为它是所引用对象的一个别名,也就是它和它所引用的对象代表同一块内存。

2>指针初始化以后可以改变指向的对象,而引用定义是必须初始化绑定到一个同类型的对象,而且初始化以后不允许再从新绑定到另一个对象(引用“从一而终” ^_^)。所以指针访问对象是间接访问,而引用访问对象是直接访问。

3>如果pa是指针,那么*pa就是引用了。因此指针使用时需要解引用。

4>在作为形参时,指针拷贝副本,而引用不拷贝副本。

5>引用不能加 const,指针可以加 const,const 的指针不可变。

6>“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小。

7>引用是类型安全的,而指针不是 (引用比指针多了类型检查。

至于相同点你可以理解成指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。记得当时我就是这样回答面试官,然后他回了一句也就是没有区别是吧,当时很无语,难道我说的不是区别吗?哎!有时感觉自己理解了,面试时想说清楚也很不容易啊!不过技术面的面试官都很有耐心的,他会从另一个方面来考察你对这个知识的掌握程度。比如说这个问题我回答的他不满意,他接着就问了函数的传值和传引用有什么区别?

下面的博文解释的还算详细:

C++中指针和引用的区别 http://www.cnblogs.com/kingln/articles/1129114.html


2.堆和栈的区别

1>栈----由编译器自动分配和释放,函数的形参,局部变量的值等都存在于程序的栈内存中,其操作方式类似于数据结构中的栈。

2>堆----由程序员自由分配和释放。若程序员分配后不释放最终可由OS回收,但我们一般要在程序中把不需要的堆内存释放掉,以避免内存的泄露。在C++中我们使用new/delete分配和释放内存,在C语言中我们使用malloc/free分配和释放内存。切记它们的使用要配对,切不可new/free,malloc/delete这样混用。

关于此问题更详细的解读,下面有一篇网上流传甚广的博文:

堆和栈的区别(经典) http://www.cnblogs.com/Kevin_z/archive/2010/03/05/1679031.html


3.变量的声明和定义的区别

这个问题平常没有仔细的想过,在面试时被问到还真心的解释的语无伦次。

声明是告诉编译器存在这样的一个标示符,定义则是为程序申请一块内存。

  
int x; //这是一个定义   
extern int x; //这是声明   
int x = 10; //这也是一个定义

char* p;  //是一个声明
p = NULL; //就是变量的定义

下面是几篇可以参考的博文:

C++定义与声明区别  http://blog.csdn.net/sjxbf/article/details/6310150

变量声明和定义  http://www.cnblogs.com/GavinDai/archive/2011/10/24/2222735.html


4.new/delete和malloc/free的区别

1>malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。他们都可用于动态内存的申请和释放。

2>对于非内部数据类型对象在创建时需要执行构造函数,对象消亡时需要执行析构函数。malloc/free是库函数,不是运算符,不在编译器控制范围内,不能把执行构造和析构函数的任务强加于malloc/free。

3>new/delete就是为了满足malloc/free的不足而产生的。使用new在动态分配内存的时候可以完成对象的初始化(执行对象的构造函数),使用delete释放动态内存时会完成对象的清理工作(执行对象的析构函数)。new/delete时运算符而非函数。

4>new出来的都是带类型信息的,而malloc出来的都会返回void指针。

5>为什么不给malloc/free库函数赋予对象初始化和释放的功能呢?我想应该是为了兼容以前的C程序。因为现实中存在着大量的运行良好的C程序,而C程序只能使用malloc/free动态分配内存,我们必须保证它的兼容性。



原创粉丝点击