程序员面试宝典知识点总结(一)

来源:互联网 发布:修改金币的软件 编辑:程序博客网 时间: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操作之后,虽然释放了内存,但是并没有把它设置为空。而后,如果再次试图使用该指针,会引起不可预料的结果。

0 0
原创粉丝点击