大家好,我是知微!
正逢求职季,分享一些嵌入式面试当中经常会遇到的题目,希望这些干货对小伙伴们面试有用哦!
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个函数指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
c
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
循环:
c
while(1) {
// 这里放置循环体内的代码
}
- 使用
for
循环:
c
for(;;) {
// 这里放置循环体内的代码
}
- 使用
do-while
循环:
c
do {
// 这里放置循环体内的代码
} while(1);
- 使用
goto
语句:
c
LOOP_START:
// 这里放置循环体内的代码
goto LOOP_START;
虽然 goto
方法可以实现
7、隐式转换规则
如下代码的输出结果是?为什么?
c
#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;
}
输出结果
c
a+b大于6
解析:
因为编译器会将有符号数b转换成为一个无符号数,即此处 a+b
等价于 a+(unsigned int)b
。
该程序运行在32bit环境下,b的值为0xFFFFFFFF-20+1 = 4294967276
,即a+b将远远大于6。
C 语言按照一定的规则来进行此类运算的转换,转换的顺序为:
c
double>float>unsigned long>long>unsigned int>int
8、sizeof和strlen的区别是什么?
sizeof()
是一个运算符,而strlen()
是一个函数。sizeof()
计算的是变量或类型所占用的内存字节数,而strlen()
计算的是字符串中字符的个数。sizeof()
可以用于任何类型的数据,而strlen()
只能用于以空字符 '\0' 结尾的字符串。sizeof()
计算字符串的长度,包含末尾的 '\0',strlen()
计算字符串的长度,不包含字符串末尾的 '\0'。
以上就是今天要分享的内容了!
📢你的每一次👍点赞 ⭐收藏 📝评论,都是我更新的动力,如有错误请留言指正,非常感谢!