程序员面试宝典知识点总结(一)
来源:互联网 发布:修改金币的软件 编辑:程序博客网 时间:2024/04/29 17:44
1. 变量初始化
int ival(1024); //直接初始化,效率更高
int ival = 1024; //复制初始化
对于内置类型来说,复制初始化和直接初始化几乎没有差别。
double salary =9999.99, wage(salary + 0.01); //用前面已经定义变量的值来初始化后面的变量。这是可行的。
内置类型变量,在函数体外定义的都自动初始化为0,在函数体内定义的不进行自动初始化。建议每个内置类型的对象都要初始化,使得程序更安全。因为使用未初始化变量不会引起编译错误。
extern int i; //只声明,不定义,不分配内存,可多次声明,只能一次定义。
extern double pi= 3.1416; //在函数外部时候,声明若有初始化式,就被当作定义了。在函数内部时候,会出现编译错误:未能初始化变量pi。
非const变量作为全局变量时,可以在同一程序的不同文件共同使用。但是const变量只能局部于本文件中,只有指定为extern才能在同一程序共享。
2. NULL
定义在cstdlib中,定义如下:
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可以看出,C++中NULL为(int)0,C中NULL为(void*)0
3. 位操作
判断一个数X是否是2的N次方:if(!X & (X-1));
将a、b交换:a = a^b; b = a^b;;a = a^b;
4. 变量作用域
5. 堆和栈的区别
这里的堆和栈,是指内存空间中的概念,不是数据结构中的堆和栈。这里之所以叫堆,是因为该块内存空间中第一个元素有最高优先权。这里之所以叫栈,是因为该块内存空间满足先进后出的数据结构。
经常需要操作的内存可分为以下几类:
(1)栈区(stack):由编译器自动分配和释放,速度快,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。栈是向低地址扩展的数据结构,其最大容量是系统预先规定好的,较小,若申请的空间超过栈的剩余空间,将提示overflow。
在栈上的数组比指针所指向的字符串(例如堆)快。
(2)堆区(heap):一般由程序员分配和释放(动态申请的空间,malloc和new),若程序员不释放,程序结束时可能由操作系统回收。操作系统维护一个记录空闲内存地址的链表,当系统收到空间申请时会遍历该链表,找到第一个空间大于申请空间的堆节点,并且在这块空间的首地址处记录本次分配的大小,以保证以后可以正确释放。
堆是向高地址扩展的数据结构,堆的大小受限于计算机系统中有效的虚拟内存,较大。不过容易产生内存碎片。Windows下使用VirtualAlloc分配内存,最快、最灵活,不是在堆也不是在栈,而是在进程的地址空间中保留一块内存。
(3)全局区(静态区,static):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的在相邻区域。程序结束后由系统释放。
(4)文字常量区:常量字符串就放在这里,程序结束后系统释放。
(5)程序代码区:存放函数体的二进制代码。
6. 函数调用的原理
函数的形参在函数未调用之前不会分配空间。
调用函数时首先进行参数压栈,一般情况下压栈顺序为从右到左,最后压函数地址。
在函数调用时,第一个进栈的是主函数中的下一条指令的地址,然后是各个参数。大多数C编译器,参数是由右往左入栈的,然后是函数中的局部变量。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中下一条可执行指令,程序由该点继续运行。
ESP寄存器存放当前线程栈顶指针,EBP寄存器存放当前线程的栈底指针,EIP寄存器存放下一个指令存放的内存地址。
7. printf的内部实现机制
printf计算参数时是从右到左压栈的。
float会自动转换成double型。
8. 类型转换
9. 运算符优先级
取反 优先于 加减 优先于 其它位运算符
10. 指针
指针可以是0值。
函数指针:void (*f) ()
函数返回指针:void* f()
const指针:const int*variable
指向const变量的指针:int* constvariable
指向const变量的const指针:const int* constvariable
指针数组:一个数组里面都是指针 int*ptr[5]
指向数组的指针;数组里面元素时int型,指针指向这个数组 int(*ptr)[5]
对于一维数组,数组名本就是指针,在前面加上&,就变成双指针,代表一个二维数组,加1就是在原地址基础上加一行。就会指向原一维数组末了元素的下个位置。
11. 迷途指针
也叫悬浮指针,是当对一个指针进行delete操作之后,虽然释放了内存,但是并没有把它设置为空。而后,如果再次试图使用该指针,会引起不可预料的结果。
- 程序员面试宝典知识点总结(一)
- 程序员面试宝典知识点总结(二)
- 《程序员面试宝典》基础知识点总结
- 程序员面试宝典知识点笔记
- 程序员面试宝典随笔记(一)----计算机网络知识点梳理
- 程序员面试宝典一
- 程序员面试宝典总结
- 程序员面试宝典知识总结
- 程序员面试宝典总结1
- 程序员面试宝典第一章总结
- 程序员面试宝典试题总结
- 面试准备 -- 程序员面试宝典 -- 重要知识点整理
- 程序员面试宝典:点滴记录一
- c++程序员面试宝典笔记(一)
- java程序员面试宝典题目(一)
- 程序员面试宝典第九章总结
- java程序员面试宝典总结笔记
- Java面试宝典总结(一)
- SqlHelper——只因为在人群中多看了你一眼
- Struck 跟踪算法(四)
- 图的深度遍历
- 1103 - Ancient Messages【后台数据】
- test2
- 程序员面试宝典知识点总结(一)
- MAC中jdk的目录
- 图结构练习——BFSDFS——判断可达性
- 程序员面试宝典知识点总结(二)
- php中的error与exception的区别与处理过程
- IList(T) 方法
- Java中的软引用,弱引用和虚引用
- sturct stat 结构体中 st_mode 的含义
- POJ 2253 Frogger