首页 > 其他分享 >速看!这8道嵌入式面试题你都会吗?

速看!这8道嵌入式面试题你都会吗?

时间:2024-04-11 23:11:45浏览次数:24  
标签:10 面试题 const 函数 int 嵌入式 速看 整型 指针

大家好,我是知微

正逢求职季,分享一些嵌入式面试当中经常会遇到的题目,希望这些干货对小伙伴们面试有用哦!

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的区别

  1. 类型安全
    • new 是 C++ 中的运算符,它自动计算需要分配的空间大小,并返回正确的类型指针,无需类型转换。
    • malloc 是 C 语言中的库函数,它需要手动计算字节数,并返回 void* 类型,使用时通常需要强制类型转换。
  2. 构造/析构函数
    • new 在分配内存的同时调用对象的构造函数,为对象的成员赋予初始值。
    • malloc 仅分配内存,不调用构造函数,因此不初始化内存。
  3. 异常处理
    • new 分配内存失败时会抛出异常(bad_alloc)。
    • malloc 分配内存失败时返回 NULL
  4. 匹配操作
    • 使用 new 分配的内存应该用 delete 来释放。
    • 使用 malloc 分配的内存应该用 free 来释放。
  5. 内存分配方式
    • new 通常分配的是单个对象的内存。
    • malloc 用来分配一段指定大小的内存区域,适合分配数组形式的内存块。
  6. 重载
    • 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的区别是什么?

  1. sizeof() 是一个运算符,而 strlen() 是一个函数。
  2. sizeof() 计算的是变量或类型所占用的内存字节数,而 strlen() 计算的是字符串中字符的个数。
  3. sizeof() 可以用于任何类型的数据,而 strlen() 只能用于以空字符 '\0' 结尾的字符串。
  4. sizeof() 计算字符串的长度,包含末尾的 '\0',strlen() 计算字符串的长度,不包含字符串末尾的 '\0'。

以上就是今天要分享的内容了!

标签:10,面试题,const,函数,int,嵌入式,速看,整型,指针
From: https://www.cnblogs.com/Wayne123/p/18130218

相关文章

  • 嵌入式设备(T507)运行qml程序提示module is not installed
    T507设备中运行qml编写的程序,提示module未安装,如下图。这是因为程序运行时未找到QML库导致的,需要在qtenv.sh文件或者系统环境变量中导出QML库在嵌入式设备文件系统中的位置,修改后如下:1exportQML2_IMPORT_PATH=$QT_ROOT/qmlqtenv.sh文件完整内容如下:1exportQTDIR=/u......
  • 嵌入式之指针、数组、函数篇(三)
    三、指针、数组、函数1.什么是指针?指针其实也是个变量,只不过这个变量里面存储的是内存地址。2.什么是指针的类型?举个例子:int*a;指针类型为int*char*c;指针类型为char*3.什么是指针所指向类型举个例子:int*a;指针指向类型为intchar*c;指针指向类型为char注......
  • 嵌入式之关键词篇(一)
    一、关键字篇1.continue语句的作用是跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。注意:continue语句并没有使整个循环终止,其只能用在循环语句2.break会使最近包含break语句跳出;在while、for循环中跳出本层循环;在swich-......
  • React常见的面试题
    1、什么是React?React是一个用于构建用户界面的javascript库。用户界面由按钮、文本和图像等小单元内容构建而成的。2、React的特点是什么?(1)、组件化(2)、虚拟dom(3)、单向数据流(4)、JSX语法(5)、高效性能(6)、生态系统丰富3、什么是JSX?JSX是一种JavaScript的语法扩展,它允许在JavaS......
  • 关于JSP的MVC设计(新手小白白week7速看)
    通过之前的学习JSP,我们发现我们可以用过Servlet来实现下图功能但是我们发现这样写也太麻烦了吧,而且工程量巨大,所以MVC设计应运而生在开始前,我们需要创建三个软件包,并且创建好我们需要的controller,dao,model相应文件通过需要在WEB-INF中创建目录views,同时把footer,header,i......
  • 嵌入式开发之瑞芯微RK356x-Buildroot 配置2
        目录BR2_PACKAGE_XXX从何而来手动下载文件让buildroot去编译output目录单独编译某个应用程序上一篇说......
  • 嵌入式开发之瑞芯微RK356x-Buildroot 添加自定义应用程序1
    上一篇我们说到具体如何去配置Buildroot,编译,验证本章我们需要添加自己的应用程序,我们就以helloworld为例子吧1.首先我们进入buildroot目录,并打开package/Config.in拉到最下面添加如下内容menu"NexyhoApp" source"package/Nexyho/Config.in"endmenu2.创建Nexyho文......
  • 面试题记录
    1.#编写一个函数来查找字符串数组中的最长公共前缀。#如果不存在公共前缀,返回空字符串#""。##示例#1:#输入:strs=["flower","flow","flight"]#输出:"fl"#示例#2:#输入:strs=["dog","racecar","car"]#输出:""#解释:......
  • Vue — Vue面试题:Vue3.0 特性
    CompositionAPI(组合式API):CompositionAPI允许开发者将逻辑按照功能或者相关性进行组织,而不是按照选项的不同部分(如data、methods、computed等)来分散代码。这种方式更灵活、更易于复用和维护,特别适用于编写大型复杂的组件。基于Proxy的响应式系统:Vue3中的响应式系统基于ES6......
  • C++笔试面试题整理
    常见C++笔试面试题整理1.C和C++的区别C是面向过程的语言,是一个结构化的语言,考虑如何通过一个过程对输入进行处理得到输出;C++是面向对象的语言,主要特征是“封装、继承和多态”。封装隐藏了实现细节,使得代码模块化;派生类可以继承父类的数据和方法,扩展了已经存在的模块,实现......