大家好,我是知微!
正逢求职季,分享一些嵌入式面试当中经常会遇到的题目,希望这些干货对小伙伴们面试有用哦!
1、介绍一下static关键字的作用
在C语言中,static 关键字有几种不同的作用,根据其用途可以大致分类如下:
- 局部变量:当static用于函数内的局部变量时,它使该变量的值在函数调用之间持久化,即变量在函数的多次调用间不会被重新初始化。它仍然只在声明它的代码块内可见。
- 全局变量:将全局变量声明为static,可以限制其链接范围仅限于定义该变量的文件内部,也就是说,它不可以被其他文件通过extern外部声明所访问。
- 函数:如果一个函数被声明为static,它的链接范围也将限制在其定义的文件内。在文件外部不可见,不能被其他文件调用。
- 类成员:在面向对象的编程语言中,如C++或Java,static可以用来声明静态成员变量和成员函数。静态成员被该类的所有实例共享,不属于任何单独的对象实例。静态成员函数同样不属于任何单个对象,因而没有this指针,并且只能访问其类的静态成员。
2、介绍一下const关键字的作用
const 关键字在C语言中用来声明一个常量。被const修饰的变量在定义后不可更改。const可以用于不同的上下文中:
- 局部变量:标记函数内的局部变量为常量,意味着该变量的值在其作用域内不能被改变。
- 全局变量:用const修饰全局变量,可以设置跨文件的不可变数据。
- 指针:const用于指针时,可以让指针指向的值或者指针本身的值(指向的地址)不可变。例如,const int *ptr表示指向的int值不可改变,而int * const ptr表示指针ptr的值(地址)不可更改。
- 函数参数:如果函数的参数被标记为const,意味着传递给函数的变量在函数内不会被改变,这对于引用和指针参数尤其重要,因为它告诉用户这些参数是用来读取而非修改的。
- 类成员:在C++中,const可以用于成员函数,表明该成员函数不会修改其所属的对象。这样的成员函数可以被一个const对象调用。
3、头文件中的 ifndef/define/endif 是干什么用的?
#ifndef、#define、#endif 这三个预处理指令用于防止头文件重复包含。首次包含时,它会定义一个宏,如果该头文件被再次包含,#ifndef 检测到宏已定义,就会跳过头文件内容,避免重复定义错误。
4、用变量a定义
a)一个整型数
 b) 一个指向整型数的指针
 c) 一个指向指针的的指针,它指向的指针是指向一个整型数
 d) 一个有10个整型数的数组
 e) 一个有10个指针的数组,该指针是指向一个整型数的:
 f) 一个指向有10个整型数数组的指针
 g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
 h) 一个有10个函数指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
a) int a; 
b) int *a;
c) int **a;
d) int a[10]; 
e) int *a[10];
f) int ( *a)[10];
g) int ( *a)(int);
h) int ( *a[10])(int);
5、new和malloc的区别
- 类型安全: - new是 C++ 中的运算符,它自动计算需要分配的空间大小,并返回正确的类型指针,无需类型转换。
- malloc是 C 语言中的库函数,它需要手动计算字节数,并返回- void*类型,使用时通常需要强制类型转换。
 
- 构造/析构函数: - new在分配内存的同时调用对象的构造函数,为对象的成员赋予初始值。
- malloc仅分配内存,不调用构造函数,因此不初始化内存。
 
- 异常处理: - new分配内存失败时会抛出异常(- bad_alloc)。
- malloc分配内存失败时返回- NULL。
 
- 匹配操作: - 使用 new分配的内存应该用delete来释放。
- 使用 malloc分配的内存应该用free来释放。
 
- 使用 
- 内存分配方式: - new通常分配的是单个对象的内存。
- malloc用来分配一段指定大小的内存区域,适合分配数组形式的内存块。
 
- 重载: - new可以被重载以提供自定义的内存分配行为。
- malloc不能被重载,因为它是 C 标准库中的一个函数。
 
6、嵌入式系统中经常要用到无限循环,如何用C编写死循环
- 使用 while循环:
while(1) {// 这里放置循环体内的代码
}
- 使用 for循环:
for(;;) {// 这里放置循环体内的代码
}
- 使用 do-while循环:
do {// 这里放置循环体内的代码
} while(1);
- 使用 goto语句:
LOOP_START: // 这里放置循环体内的代码
goto LOOP_START;
虽然 goto 方法可以实现
7、隐式转换规则
如下代码的输出结果是?为什么?
#include <stdio.h>
int main(void)
{
unsigned int a = 6;
int b = -20;if (a + b > 6)
printf("a+b大于6\n");
else
printf("a+b小于6\n");return 0;
}
输出结果
a+b大于6
解析:
因为编译器会将有符号数b转换成为一个无符号数,即此处 a+b 等价于 a+(unsigned int)b 。
该程序运行在32bit环境下,b的值为0xFFFFFFFF-20+1 = 4294967276,即a+b将远远大于6。
C 语言按照一定的规则来进行此类运算的转换,转换的顺序为:
double>float>unsigned long>long>unsigned int>int
8、sizeof和strlen的区别是什么?
- sizeof()是一个运算符,而- strlen()是一个函数。
- sizeof()计算的是变量或类型所占用的内存字节数,而- strlen()计算的是字符串中字符的个数。
- sizeof()可以用于任何类型的数据,而- strlen()只能用于以空字符 ‘\0’ 结尾的字符串。
- sizeof()计算字符串的长度,包含末尾的 ‘\0’,- strlen()计算字符串的长度,不包含字符串末尾的 ‘\0’。
以上就是今天要分享的内容了!
📢你的每一次👍点赞 ⭐收藏 📝评论,都是我更新的动力,如有错误请留言指正,非常感谢!