嵌入式常见面试题
在嵌入式领域,面试中常见的问题涉及到C语言的基础和特性,这些知识点对于初学者尤为重要。下面我们将详细探讨其中的一些关键点。 1. 指针类型的差异: - `char * const p`:这是一个常量指针,意味着指针p的值(即它指向的地址)不可变。 - `char const * p`:这是指向常量的指针,意味着p所指向的字符不可修改,但指针本身可以改变。 - `const char *p`:同样表示指向常量的指针,与上面的等价。 2. 代码错误分析: ```c int main() { char a; char *str = &a; strcpy(str, "hello"); printf(str); return 0; } ``` 这段代码试图将字符串"hello"复制到单个字符变量a的地址,会导致内存异常,因为str没有分配足够的内存来存储整个字符串。 3. 宏定义: ```c #define Min(X, Y) ((X)>(Y)?(Y):(X)) ``` 这个宏用于返回两个参数中的较小值。注意,宏定义不需以分号结束。 4. 字符串常量与指针: ```c char* s="AAA"; s[0]='B'; printf("%s",s); ``` 这里,"AAA"是字符串常量,尝试通过s[0]='B'修改常量是非法的,应使用`const char *s="AAA"`。 5. 死循环实现: 在C语言中,死循环通常通过`while(1)`或`for(;;)`实现。 6. 关键字`const`: `const`关键字用于声明常量,表明该变量的值在程序运行期间不应被修改。 7. 关键字`static`: - 函数内部的`static`变量在函数调用之间保持其值。 - 文件(模块)范围内的`static`变量只在定义它的文件内可见。 - `static`函数仅限于在定义它的模块内部调用。 8. 关键字`volatile`: `volatile`指示编译器不要优化变量,因为它可能会被未被程序控制的事件(如硬件中断)改变。 9. 函数指针: `int (*s[10])(int)`表示一个包含10个元素的数组,每个元素都是一个指向接受整数参数并返回整数的函数的指针。 10. 无额外变量的交换: 可以通过加法或异或运算来交换两个变量的值: ```c a = a + b; b = a - b; a = a - b; 或者 a = a ^ b; b = a ^ b; a = a ^ b; ``` 11. `static`全局变量与普通全局变量: 静态全局变量只在定义它的文件内可见,而非静态全局变量在整个程序中都可见。 12. `static`局部变量与普通局部变量: 静态局部变量在函数调用之间保持其值,而普通局部变量每次调用都会初始化。 13. `static`函数与普通函数: 静态函数只在其定义的文件内可见,而普通函数在整个程序中都可见。 14. 内存区域: - 全局变量和静态局部变量存储在静态存储区。 - 局部变量存储在栈中。 - 动态分配的数据存储在堆中。 15. 堆栈溢出: 常由未回收的资源或深度递归调用引起。 16. 引用全局变量: 使用`extern`关键字声明全局变量,或包含定义变量的头文件。 17. 队列与栈的区别: - 队列遵循先进先出(FIFO)原则。 - 栈遵循后进先出(LIFO)原则。 18. 头文件的`ifndef/define/endif`: 用于防止头文件被多次包含,确保每个头文件只被编译一次。 19. `#include`的区别: - `<file.h>`:从标准库路径查找文件。 - `"file.h"`:从当前工作目录查找文件。 20. do...while与while...do的区别: - do...while循环先执行一次循环体,再检查条件。 - while...do循环先检查条件,满足才执行循环体。 以上就是嵌入式面试中常见的一些C语言知识点,对于理解和编写嵌入式系统代码至关重要。理解并掌握这些概念,可以帮助开发者更好地进行嵌入式系统的开发和调试。