面试中常见的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动态分配内存,我们必须保证它的兼容性。
- 面试中常见的C/C++问题集锦
- C语言面试问题集锦
- 常见英语面试问题集锦
- 常见英语面试问题集锦
- [C#] C#.Net的常见面试试题
- Linux下C代码开发中遇到的问题集锦
- 面试中常见的问题
- 面试中常见C/C++库函数实现
- C/C++面试题目集锦
- C/C++面试题目集锦
- C++/C中常见小问题总结
- C语言常见经典面试题集锦(更新中)
- linux c问题集锦
- C语言问题集锦
- C#.Net的常见面试试题(1)
- C#.Net的常见面试试题(2)
- C#.Net的常见面试试题(3)
- C#.Net的常见面试试题
- android 功能代码-----Android报表控件achartengine介绍(一)
- 自学中走出的大三学生面临就业选择
- Oracle RAC Cache Fusion 机制 详解
- 简明 Vim 练级攻略
- android上gdb coredump步骤
- 面试中常见的C/C++问题集锦
- DB2错误信息(按sqlcode排序)
- 了解事件的类型
- POJ1743--Musical Theme
- 重复输出字符串
- Manifest文件
- 脚本语言
- AIX如何开机自动重新启动程序
- JS左移右移