C语言面试笔记
1.static的作用: (1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。 --static局部变量只初始化一次,下一次依据上一次的结果值 (2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 --static全局变量只初始化一次,防止在其他文件单元被引用 (3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 --static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
2.引用与指针有什么区别 (1) 引用必须被初始化,指针不必。 (2) 引用初始化以后不能被改变,指针可以改变所指的对象。 (3) 不存在指向空值的引用,但是存在指向空值的指针。
3. 描述实时系统的基本特性 ——在特定时间内完成特定的任务,实时性与可靠性
4.全局变量和局部变量的区别: 全局变量储存在静态区,进入main函数之前就被创建,生命周期为整个源程序;局部变量在堆栈(动态分配的在堆上),在函数被调用时才创建,生命周期为函数内。
5.什么是平衡二叉树: 左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。
6.堆栈溢出一般是由什么原因造成的: (1)没有回收垃圾资源:存储空间垃圾太多 内存已满 (2)层次太深的递归调用:重复调用自己导致内存不足
7.常用排序的时间及空间复杂度 排序法 | 最差时间分析 | 平均时间复杂度 | 稳定度 | 空间复杂度 | 冒泡排序 | O(n2) | O(n2) | 稳定 | O(1) | 快速排序 | O(n2) | O(n*log2n) | 不稳定 | O(log2n)~O(n) | 选择排序 | O(n2) | O(n2) | 稳定 | O(1) | 二叉树排序 | O(n2) | O(n*log2n) | 不一顶 | O(n) | 插入排序 | O(n2) | O(n2) | 稳定 | O(1) | 堆排序 | O(n*log2n) | O(n*log2n) | 不稳定 | O(1) | 希尔排序 | O | O | 不稳定 | O(1) |
二者不可兼得:以时间换空间,以空间换时间(想节省空间就要耗费时间,想节省时间必要耗费空间)
8. 各类型与零值的比较 写出floatx 与零值比较的if语句:if(x > 0.000001 && x <-0.000001)(6~7位) 写出bool flag 与“零值”比较的if 语句: if ( flag )//表示flag为真 或 if ( !flag )//表示flag为假 写出char *p 与“零值”比较的if 语句 : if (p == NULL) 或 if (p != NULL) 写出整形变量x与零值的比较的if语句:if(x == 0) 或 if(x != 0)
9.不能做switch()的参数类型是:实型 因为switch后面只能带自动转换为整形(包括整形)的类型,比如字符型char,unsigned int等,实数型不能自动转换为整形.可以手动强转实数型(int)double,但是会导致精度的丢失。
10.局部变量能否和全局变量重名? 能。局部变量会自动屏蔽全局变量,要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
11.全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 可以。在不同的.c文件中以static形式来声明同名全局变量。
12.进程和线程的区别: ——线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
13.嵌入式系统中经常要用到无限循环:while(1){}或者for(;;)或者Loop:...gotoLoop;
|