昨日事件:
昨天腾讯一面,基础题80%都答的特别流畅!!!,但是应该过不了,因为项目不符合他们的要求,但是!人总要有希望的,我觉得这次一定给我过!准备二面!
面试题:
1. 野指针
野指针:没有指向内存的指针。
造成野指针的原因:
1. 指针变量未初始化。
2. 指针指向的内存被释放,而指针没有处理。
3. 指针超过变量作用范围。例如函数局部变量的地址值被传出来,而局部变量会在函数执行完自动清理,此时的地址值是不安全的,随时都可能被覆盖。
2. 函数运行全过程的底层机制
1. 分配被调用函数所需的栈空间---代码执行需要相应空间
2. 保存当前函数的运行状态和返回地址---被调函数执行完以后放回当前地址继续运行。
3. 传递参数---传值参数或者传地址。
4. 将控制权转交给被调函数。
5. 被调函数执行完毕,释放栈空间,返回之前地址。
3. typedef和define有什么区别
typedef:常用来定义一个标识符及关键字的别名,语言编译过程的一部分,不分配内存空间。可以增强程序的可读性,标识符的灵活性。常用于:
1. 定义类型别名
2. 辅助struct定义别名(c++11不需要)
3. 定义与平台无关的类型(不同平台支持的类型不同)
define:宏定义语句,定义常量,在预编译过程就完成。
区别:
1. 宏定义只是简单的字符串代换(原地扩展),typedef具有一定的封装性。例如:
typedef (int*) pINT; pINT a,b效果等于int *a, *b;
#define pINT int*; pINT a,b效果等于int *a, b;
4. define与const的区别
共同作用:定义常量
区别:
1. 编译器处理方式不同:define作用于预处理,const作用于编译阶段
2. 类型检查不同:define无类型,不进行类型安全检查,const有数据类型,进行类型检查
3. 内存空间:define不分配内存,const在静态存储区分配内存
5. vector中resize()和reserve()区别
resize(): 重新申请并改变当前vector对象的有效空间大小,改变有效空间大小:小于空间大小,裁剪多出来的数据,capacity不变,大于空间大小,赋值为定义数据,capacity大小与改变大小相同。
reserve():重新申请并改变当前vector对象的总空间(capacity)大小,不改变有效数据大小。
6. 介绍RB-tree和时间复杂度
定义:红黑树是一种含有红黑结点并能自平衡的二叉树,时间复杂度为O(log2n)。
性质:
1. 结点非黑即红。
2. 根节点黑色,叶子节点(NIL)也是黑色。
3. 每个红色结点的两个子结点一定是黑色。
4. 任意结点到每个叶子结点的路径都包含相同数量的黑结点。