当前位置: 首页 > news >正文

嵌入式面试笔试那点事2:2025.4.13

做了某厂的笔试题,全程监控监考压力还是挺大的。。。挑几个博主记得比较清楚的有价值的简答题写写。

一、详细从生命周期、作用域等方面说明普通局部变量、普通全局变量、静态局部变量、静态全局变量

1. 普通局部变量

  • 定义: 在某个函数或代码块内部定义的变量。
  • 作用域: 仅在定义它的函数或代码块内有效。
  • 生命周期: 该变量在函数或代码块开始执行时被创建,当函数或代码块执行结束后,变量被销毁。
  • 特点: 每次进入函数时都会重新创建,并且不同的函数或调用中相同名字的局部变量是相互独立的。

2. 普通全局变量

  • 定义: 在所有函数外部定义的变量。
  • 作用域: 整个程序,所有函数都可以访问和修改。
  • 生命周期: 从程序开始执行时创建,直到程序结束时被销毁。
  • 特点: 由于可以在多个函数之间共享数据,容易造成意外修改,需谨慎使用。

3. 静态局部变量

  • 定义: 在函数内定义,并用 static 关键字修饰的变量。
  • 作用域: 仅在定义它的函数内有效。
  • 生命周期: 该变量在程序执行时创建,并在程序结束后才被销毁。即使函数结束,变量的值会被保留。
  • 特点: 用于保留函数调用之间的状态,适合需要记住上次调用状态的情况下使用。

4. 静态全局变量

  • 定义: 在所有函数外部定义,并用 static 关键字修饰的变量。
  • 作用域: 限于定义它的文件内,其他文件不能访问(文件作用域)。
  • 生命周期: 与普通全局变量相同,从程序开始执行时创建,直到程序结束时被销毁。
  • 特点: 防止名称冲突,适合于多文件项目中,确保变量不会被其他文件中的同名变量影响。

小结

类型作用域生命周期例子
普通局部变量函数内函数调用期间int a;
普通全局变量整个程序从程序开始到结束int b;
静态局部变量函数内从程序开始到结束static int c;
静态全局变量文件内从程序开始到结束static int d;

二、变量声明和定义的区别 

1. 变量声明

  • 定义: 变量声明是告诉编译器变量的名称和类型,但不为该变量分配内存
  • 作用: 主要用于在一个作用域内,可以使用该变量,允许编译器在随后的代码中识别该变量。
  • 特点:
    • 可以在多个地方进行声明。
    • 声明不会占用内存(在某些情况下,特别是在头文件中使用 extern 声明时)。
    • 示例:
      extern int x; // 声明,表示 x 是一个整数类型的变量,但未定义(未分配内存)
      

2. 变量定义

  • 定义: 变量定义不仅包括变量的名称和类型,还包括分配内存以存储该变量的值。
  • 作用: 创建变量的实际存储,并允许在程序中使用该变量进行读写操作。
  • 特点:
    • 在同一作用域内每个变量只能定义一次。
    • 定义会占用内存。
    • 示例:
      int x; // 定义,表示创建一个整数类型的变量 x,并为其分配内存
      

总结

特性声明定义
定义内容名称和类型名称、类型和存储空间
内存占用不占用占用内存
允许次数可以多次声明同一作用域内只能定义一次
示例extern int x;int x;

小结

  • 声明用于告诉编译器变量的存在,其本身不分配内存。
  • 定义则是实际创建变量并为其分配内存。

变量声明和定义的区别关系到程序的整体结构和模块化,特别是在大型项目或模块化代码中,合理使用声明和定义可以提高代码的可读性和维护性。

三、描述C语言源代码是如何转化为可执行文件的

C语言源代码的转化过程涉及多个步骤,从源代码到可执行文件的生成,每一步都至关重要。以下是详细的转换过程:

1. 编写源代码

  • 步骤: 开发者使用文本编辑器编写 C 语言源代码,文件通常以 .c 为扩展名。

2. 预处理 (Preprocessing)

  • 工具: C 预处理器 (如 cpp)
  • 过程:
    • 处理以 # 开头的指令,例如 #include#define
    • 所有的宏定义、条件编译和文件包含都会在这一阶段被处理。
    • 结果是一个扩展名为 .i 的中间文件,包含了经过处理的源代码。

3. 编译 (Compilation)

  • 工具: C 编译器 (如 gcc)
  • 过程:
    • 将预处理后的代码(.i 文件)翻译成汇编语言。
    • 生成一个扩展名为 .s 的汇编语言文件。
    • 这个过程中会进行语法分析、语义分析及优化。

4. 汇编 (Assembly)

  • 工具: 汇编器 (如 as)
  • 过程:
    • 将汇编语言文件(.s 文件)转化为机器代码。
    • 生成一个目标文件,通常以 .o.obj 为扩展名,包含了二进制机器代码,但尚未完全链接。

5. 链接 (Linking)

  • 工具: 链接器 (如 ld)
  • 过程:
    • 将一个或多个目标文件(.o 文件)链接在一起,包含标准库或其他库(如操作系统提供的库)。
    • 处理外部符号引用,将不同目标文件中的符号和地址修正,生成最终的可执行文件。
    • 结果是一个可执行文件,通常以无扩展名或 .exe (在 Windows 中)结尾。

6. 生成可执行文件

  • 结果: 此时经过链接的目标文件变成了可执行文件,可以运行该程序。

小结

整个过程可以简化为以下几点:

  1. 源码 (.c) ➔ 预处理汇编代码 (.s)
  2. 汇编代码 (.s) ➔ 汇编目标文件 (.o)
  3. 目标文件 (.o) ➔ 链接可执行文件

四、 简要说明union在C语言程序中的作用

1. 内存节省

  • 作用: union 共享相同的内存空间,这意味着在同一时间只能存放一个成员的值。
  • 特点: 联合体的大小等于其最大成员的大小,这使得在需要存储多种类型但只使用其中一种的情况下节省内存。

2. 类型灵活性

  • 作用: union 允许在运行时根据需要使用不同的数据类型,这对处理多种数据输入或输出非常有用。
  • 特点: 可以将一个 union 声明为多种类型,这使得代码能够灵活处理不同数据格式。

3. 数据结构

  • 作用: 与结构体结合使用,union 可以构建更复杂的数据结构,例如在实现数据表、数据库记录或多态数据接口时。
  • 特点: 可以嵌套使用 unionstruct,便于管理复杂数据。

4. 高效的数据处理

  • 作用: 在某些情况下,例如操作硬件寄存器或进行位操作,使用 union 可以方便地管理数据。
  • 特点: 可以通过不同的类型访问同一块内存,提高了数据处理的效率。

示例

以下是一个简单的 union 示例,展示了如何在程序中使用联合体:

#include <stdio.h>

union Data {
    int intValue;
    float floatValue;
    char charValue;
};

int main() {
    union Data data;

    data.intValue = 10;
    printf("Integer: %d\n", data.intValue);

    data.floatValue = 220.5;
    printf("Float: %f\n", data.floatValue); // 注意,这里可能会产生不可预知的结果,因为数据覆盖了之前的值。

    data.charValue = 'A';
    printf("Char: %c\n", data.charValue); // 同样,这个值覆盖了之前的 float。

    return 0;
}

结论

  • 内存节省: 适用于需要存储不同类型但不需同时存储多个值的场景。
  • 灵活性与效率: 提高了数据结构的灵活性与访问效率。
  • 复杂数据处理: 在构建复杂数据结构时,union 显得非常有用。

相关文章:

  • Vue事件修饰符课堂练习
  • golang-context详解
  • MySQL varchar 最大长度
  • 【苹果cms 2】资源站动漫采集爬取
  • C#容器源码分析 --- List<T>
  • AI技术实战:从零搭建图像分类系统全流程详解
  • SaaS、Paas、IaaS、MaaS、BaaS五大云计算服务模式
  • 【前端网络请求】XHR封装,支持文件上传、进度监控、混合字段传输
  • 基于SpringBoot的瑜伽馆管理系统【附源码】
  • Java 基础数据类型与运算符深度剖析
  • Python、C++中的查找
  • Spring Bean的创建过程与三级缓存的关系详解
  • socket到底是什么
  • 分发饼干问题——用贪心算法解决
  • Oracle 11G RAC 删除添加节点(一):删除节点
  • 智能SEO关键词AI精准布局
  • swagger 注释说明
  • LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
  • 【5G学习】5G中常说的上下文之上下文响应
  • 在线地图支持天地图和腾讯地图,仪表板和数据大屏支持发布功能,DataEase开源BI工具v2.10.7 LTS版本发布
  • 上海国际咖啡文化节开幕,北外滩集结了超350个展位
  • 狄威已任国铁集团副总经理
  • 金科股份:去年营收约275亿元,今年确保所有项目“零烂尾”
  • 建发股份:将于5月6日召开股东大会,审议提名林茂等为公司新一届董事等议案
  • 王毅会见泰国外长玛里:坚决有力打击电诈等跨境犯罪
  • 众信旅游:去年盈利1.06亿元,同比增长228.18%