准备找工作ing,题目不是我自己遇到的,都是网上整理来的,非常感谢各路网友的分享。
答案可能自己加工过,尽量保证正确全面,欢迎大家阅读后指正指点指教!
只涉及C C++两种语言,数据结构和算法另外单开一贴。
第一大类:指针和内存空间
Q: 指针和引用的区别
A:
1)指针定义时不一定要初始化,初始化后可以改变指向的对象;引用定义时必须初始化,不存在空引用,而且初始化后不能改变绑定对象;
2)指针是一种数据类型,系统为指针分配内存; 引用不是数据类型,引用是对象的别名,系统不为引用分配内存,引用与绑定对象共享内存;
3)使用指针访问绑定对象要解引用,是间接访问;使用引用访问绑定对象是直接访问;
4)向函数传形参的时候,指针本身是拷贝副本的,而引用不拷贝。
Q: memcpy和strcpy的区别
A:
1)strcpy和memcpy都是标准C库函数
2)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等;
3)复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出;memcpy则是根据其第3个参数决定复制的长度;
4)用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。
(http://www.cnblogs.com/stoneJin/archive/2011/09/16/2179248.html)
Q: new和malloc的区别,free和delete的区别
A:
1)malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符;所以malloc/free要库文件支持,new/delete则不要。
2)对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free;
3)new自动计算需要分配的空间,而malloc需要手工计算字节数;
4)new是类型安全的,而malloc不是,比如:
int* p = new float[2]; // 编译时指出错误
int* p = malloc(2*sizeof(float)); // 编译时无法指出错误
5)new将调用constructor,而malloc不能;delete将调用destructor,而free不能
6)在用delete 释放对象数组时,留意不要丢了符号‘[]’。
(http://blog.youkuaiyun.com/hackbuteer1/article/details/6789164)
Q: 指针在16位机、32位机、64位机分别占用多少个字节
A:
1)16位机 2字节; 32位机 4字节; 64位机 8字节。
2)函数指针可能会有例外。
(http://www.zhihu.com/question/19691905)
Q: 描述内存分配方式以及它们的区别
A:
1)有四个段(UNIX,从低地址到高地址顺序为):代码段(code/text segment)、数据段(data segment)或全局段(global segment)、堆(heap segment)和栈(stack segment);
2)其中 数据段 可以再分成:初始数据段(initialised data segment)和BSS数据段(block start by symbol data segments),两者也经常被叫做全局初始化区和全局未初始化区。
3)其中初始数据段还可以再分为只读区(read-only area)和读写区(read-write area),前者也叫做常量区,后者也叫做(狭义的)全局初始化区。
4)代码段大小固定,只读,存放编译后的程序; 数据段(或全局段)大小固定,存放全局变量、静态变量、静态类和命名空间成员;
堆段比较大,有程序员显示的分配内存和释放内存;栈段比较小,存放局部变量,程序负责分配和释放内存。
5)没必要区分自由存储区(malloc/free)和堆区(new/delete),看不出意义。
6)如程序注释
inta =0;//全局初始化区
char *p1; //全局未初始化区
int main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456");
//123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}(http://www-cs-faculty.stanford.edu/~eroberts/courses/cs106b/handouts/25-heap-stack-diagrams.pdf)
(http://blog.youkuaiyun.com/north23/article/details/3885168)
(http://www.questionscompiled.com/answer/cpp/3/memory-organization/)
第二大类:关键词和宏定义
第三大类:类、面向对象
Q: 面向对象的三大(四大)特性
1)封装、继承、多态、(抽象)。
第四大类:特殊技巧
Q: There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.
A: ( ( a + b ) + abs( a – b ) ) / 2
这个效率高些,且不怕溢出;
a ^= b;
b ^= a;
a ^= b;