嵌入式开发工程师面试题 - 2024/11/24
原文嵌入式开发工程师面试题 - 2024/11/24 转载请注明来源
1.若有以下定义语句double a[8],*p=a;int i=5;对数组元素错误的引用是?
A *a
B a[5]
C *(p+1)
D p[8]
解析:
在 C 或 C++ 语言中,对于数组和指针的操作需要严格遵守语法规则。
我们逐一分析选项来确定哪个是对数组元素错误的引用:
A. *a
-
这是正确的。
a
是数组名,它在大多数表达式中等价于指向数组第一个元素的指针。因此,*a
等价于a[0]
,表示数组的第一个元素。
B. a[5]
-
这也是正确的。
a[5]
直接引用数组的第六个元素(数组索引从 0 开始)。
C. *(p+1)
-
这同样是正确的。
p
是一个指向double
类型的指针,指向数组a
的第一个元素。p+1
将指针移动到数组的第二个元素,*(p+1)
解引用这个指针,得到数组的第二个元素,即a[1]
。
D. p[8]
-
这是错误的。在 C/C++ 中,
p[i]
是指针p
偏移i
个元素后的值的简写,等价于*(p+i)
。因此,p[8]
等价于*(p+8)
,这意味着尝试访问p
指向的位置之后的第九个double
元素。由于p
指向的是一个只有 8 个元素的数组,p[8]
尝试访问数组之外的内存,这是越界的,因此是错误的。
综上所述,错误的引用是 D. p[8]。
2.在上下文及头文件均正常的情况下,设:
enum color { red, yellow = 2, blue, white, black }r = white;
,执行 printf("%d", r) ;后的输出结果是?
解析:
在C语言中,enum
类型用于定义一组命名的整数常量。当定义enum
时,可以给枚举成员显式赋值,也可以不赋值。如果未显式赋值,则枚举成员的值将默认为前一个成员的值加1(第一个未赋值的成员默认为0)。
考虑以下enum
定义:c
复制代码
enum color { red, yellow = 2, blue, white, black } r = white; |
这里,enum color
定义了五个成员:
-
red
:未显式赋值,且是第一个成员,因此默认为0。 -
yellow
:显式赋值为2。 -
blue
:未显式赋值,因此继承yellow
的值加1,即3。 -
white
:未显式赋值,因此继承blue
的值加1,即4。 -
black
:未显式赋值,因此继承white
的值加1,即5。
同时,定义了一个enum color
类型的变量r
,并将其初始化为white
。
由于white
的值是4,因此执行printf("%d", r);
后,输出结果是4。
总结:执行printf("%d", r);
后的输出结果是4
。
3.对于条件表达式(k)?(i++):(i--)来说,其中的表达式k等价于()
A k==0
B k==1
C k!=0
D k!=1
解析:
在C语言中,条件表达式(也称为三元运算符)的语法是:
复制代码
condition ? expression1 : expression2; |
这里,condition
是一个任意表达式,它会被评估为真(非零)或假(零)。如果 condition
为真(即非零),则整个条件表达式的结果是 expression1
的值;如果 condition
为假(即零),则结果是 expression2
的值。
现在考虑给定的条件表达式:
代码
(k) ? (i++) : (i--); |
在这个表达式中,k
是条件部分。根据条件表达式的规则,k
会被评估:
-
如果
k
的值非零(即真),则执行i++
。 -
如果
k
的值为零(即假),则执行i--
。
这里的关键是理解 k
如何被评估。在C语言中,任何非零值都被视为真,而零被视为假。因此,当 k
被用作条件时,它实际上是在检查 k
是否不等于零。
现在来看选项:
A. k==0
:这是检查 k
是否等于零,与条件表达式的逻辑不符。
B. k==1
:这是检查 k
是否等于1,这同样不是条件表达式所检查的。
C. k!=0
:这是检查 k
是否不等于零,这与条件表达式中 k
的评估方式相符。
D. k!=1
:这是检查 k
是否不等于1,这也不是条件表达式所检查的。
因此,对于条件表达式 (k) ? (i++) : (i--)
来说,其中的表达式 k
等价于 k!=0
。
正确答案是 C。
4.设有以下函数void fun(int n,char *s)(......),则下面对函数指针的定义和赋值均是正确的:()
A void (*pf)(int,char); pf=&fun;
B void (*pf)(int n,char *s); pf=fun;
C void *pf(); *pf=fun;
D void *pf(); pf=fun;
解析:
在C语言中,定义一个指向函数的指针需要指定函数的返回类型、函数名(在指针定义中省略)以及函数的参数类型。对于给定的函数:
复制代码
void fun(int n, char *s); |
我们需要定义一个函数指针,该指针能够指向这样一个函数:返回类型为void
,接受一个int
类型的参数和一个char *
类型的参数。
现在,我们逐一分析选项:
A. void (*pf)(int,char); pf=&fun;
-
这个选项中的函数指针定义是错误的。它应该指定第二个参数为
char *
类型,而不是char
类型。此外,虽然取函数地址是常见的做法,但在这个上下文中,直接赋值pf = fun;
也是合法的,因为函数名在大多数表达式中会被解释为指向该函数的指针。
B. void (*pf)(int n,char *s); pf=fun;
-
这个选项是正确的。函数指针
pf
被正确地定义为指向一个接受int
和char *
参数并返回void
的函数。然后,pf
被赋值为fun
,这是合法的,因为fun
是一个符合该签名的函数。
C. void *pf(); *pf=fun;
-
这个选项是错误的。首先,
pf
被定义为一个指向返回void
且不接受任何参数的函数的指针。这与fun
的签名不匹配。其次,*pf=fun;
是尝试对函数指针进行解引用并赋值,这是不合法的。
D. void *pf(); pf=fun;
-
这个选项同样是错误的。与选项C类似,
pf
的定义与fun
的签名不匹配。此外,尝试将函数名fun
直接赋值给pf
也是不正确的,因为类型不匹配。
综上所述,只有选项B正确地定义了函数指针,并将其赋值为指向给定函数的指针。
正确答案是B:
5.阅读下面代码:
class B
{
public:
virtual void Fun(){}
};
class D: public B
{
public:
void Fun(){}
};
D dd;
B* pb = ⅆ
D* pd = ⅆ
pb->Fun();
pd->Fun();
上述例程调用的Fun函数顺序为()
A B::Fun, D::Fun
B B::Fun, B::Fun
C D::Fun, D::Fun
D D::Fun, B::Fun
解析:
在C++中,虚函数(virtual function)机制允许派生类(derived class)重写(override)基类(base class)中的函数。当通过基类指针或引用调用虚函数时,实际调用的函数是派生类中重写的那个版本,而不是基类中的版本。这种动态绑定(dynamic binding)或称为运行时多态性(runtime polymorphism)是面向对象编程中的一个核心概念。
现在,我们来分析提供的代码:c复制代
-
class B
定义了一个虚函数Fun()
。 -
class D
继承自B
并重写了Fun()
函数。 -
创建了一个
D
类型的对象dd
。 -
B* pb = ⅆ
创建了一个指向dd
的B
类型的指针pb
。由于B
中的Fun()
是虚函数,通过pb
调用Fun()
时,将发生动态绑定,实际调用的是D
类中的Fun()
。 -
D* pd = ⅆ
创建了一个指向dd
的D
类型的指针pd
。通过pd
调用Fun()
时,直接调用的是D
类中的Fun()
,因为这里没有涉及多态性(即没有通过基类指针调用派生类函数)。
现在,我们来看函数调用的顺序:
-
pb->Fun();
:由于pb
是B
类型的指针,但指向D
类型的对象,且Fun()
是虚函数,因此这里调用的是D::Fun()
。 -
pd->Fun();
:pd
是D
类型的指针,直接指向D
类型的对象,因此这里调用的也是D::Fun()
。
综上所述,调用的 Fun
函数顺序为 D::Fun, D::Fun
。
正确答案是 C。
未完待续,持续更新!
以防后边找不到可以点赞收藏下!
相关文章:
嵌入式开发工程师面试题 - 2024/11/24
原文嵌入式开发工程师面试题 - 2024/11/24 转载请注明来源 1.若有以下定义语句double a[8],*pa;int i5;对数组元素错误的引用是? A *a B a[5] C *(p1) D p[8] 解析: 在 C 或 C 语言中&am…...

Python中打印当前目录文件树的脚本
效果图: 实现脚本: 1、显示所有文件和文件夹: import osdef list_files(startpath, prefix):items os.listdir(startpath)items.sort()for index, item in enumerate(items):item_path os.path.join(startpath, item)is_last index le…...

全景图像(Panorama Image)向透视图像(Perspective Image)的跨视图转化(Cross-view)
一、概念讲解 全景图像到透视图像的转化是一个复杂的图像处理过程,它涉及到将一个360度的全景图像转换为一个具有透视效果的图像,这种图像更接近于人眼观察世界的方式。全景图像通常是一个矩形图像,它通过将球面图像映射到平面上得到…...
Redis 中的 hcan 命令耗内存,有什么优化的方式吗 ?
Redis 中的 hcan 命令耗内存,有什么优化的方式吗 ? 1. 使用合适的游标值:2. 控制每次迭代返回的键数量:3. 避免长时间运行的迭代:4. 使用HSCAN与SCAN命令结合:5. 优化哈希表结构:6. 监控和调整R…...

豆包MarsCode算法题:三数之和问题
问题描述 思路分析 1. 排序数组 目的: 将数组 arr 按升序排序,这样可以方便地使用双指针找到满足条件的三元组,同时避免重复的三元组被重复计算。优势: 数组有序后,处理两个数和 target - arr[i] 的问题可以通过双指针快速找到所有可能的组…...

【Android】AnimationDrawable帧动画的实现
目录 引言 一、AnimationDrawable常用方法 1.1 导包 1.2 addFrame 1.3 setOneShot 1.4 start 1.5 stop 1.6 isRunning 二、 从xml文件获取并播放帧动画 2.1 创建XML文件 2.2 在布局文件中使用帧动画资源 三、在代码中生成并播放帧动画 3.1 addFrame加入帧动画列…...

【消息序列】详解(7):剖析回环模式--设备测试的核心利器
目录 一、概述 1.1. 本地回环模式 1.2. 远程环回模式 二、本地回环模式(Local Loopback mode) 2.1. 步骤 1:主机进入本地环回模式 2.2. 本地回环测试 2.2.1. 步骤 2a:主机发送HCI数据包并接收环回数据 2.2.2. 步骤 2b&…...
解决Ubuntu 22.04系统中网络Ping问题的方法
在Ubuntu 22.04系统中,网络问题时有发生,尤其是当涉及到静态IP地址配置和网线直连的两台机器时。本文将探讨一种常见问题——断开并重新连接网线后,尽管网卡显示为UP状态,但无法立即ping通对方机器,以及如何解决这一问…...

【大数据学习 | Spark-SQL】Spark-SQL编程
上面的是SparkSQL的API操作。 1. 将RDD转化为DataFrame对象 DataFrame: DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。这样的数…...

15分钟做完一个小程序,腾讯这个工具有点东西
我记得很久之前,我们都在讲什么低代码/无代码平台,这个概念很久了,但是,一直没有很好的落地,整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来,各大科技公司也都推出了很多 AI 代码助手ÿ…...

manim动画编程(安装+入门)
文章目录 1.基本介绍2.效果展示3.安装步骤3.1安装manba软件3.2配置环境变量3.3查看是否成功3.4什么是mamba3.5创建虚拟环境3.6尝试进入虚拟环境 4.vscode操作4.1默认配置文件 5.安装ffmpeg6.安装manim软件6.vscode制作7.我的学习收获 1.基本介绍 这个manim就是一款软件&#x…...
STL算法之数值算法<stl_numeric.h>
这一节介绍的算法,统称为数值(numeric)算法。STL规定,欲使用它们,客户端必须包含头文件<numeric>.SGI将它们实现与<stl_numeric.h>文件中。 目录 运用实例 accumulate adjacent_difference inner_product partial_sum pow…...
Oracle如何记录登录用户IP
在运维场景中,在定位到某个SQL引起系统故障之后,想知道是哪台机器发过来的,方便定位源头,该如何解决? 在 Oracle 数据库中记录登录用户的 IP 地址可以通过多种方法实现。以下是几种常见的方法,包括使用触发…...

Python图像处理:打造平滑液化效果动画
液化动画中的强度变化是通过在每一帧中逐渐调整液化效果的强度参数来实现的。在提供的代码示例中,强度变化是通过一个简单的线性插值方法来控制的,即随着动画帧数的增加,液化效果的强度也逐渐增加。 def liquify_image(image, center, radius…...
构建Ceph分布式文件共享系统:手动部署指南
#作者:西门吹雪 文章目录 micro-Services-TutorialCeph分布式文件共享方案部署Ceph集群使用CephCeph在kubernetes集群中的使用 micro-Services-Tutorial 微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应…...

数据结构——用数组实现栈和队列
目录 用数组实现栈和队列 一、数组实现栈 1.stack类 2.测试 二、数组实现队列 1.Queue类 2.测试 查询——数组:数组在内存中是连续空间 增删改——链表:链表的增删改处理更方便一些 满足数据先进后出的特点的就是栈,先进先出就是队列…...
vue3typescript,shims-vue.d.ts中declare module的vue声明
webpack已经有了vue-loader这些loader了,为什么还需要declare module *.vue’呢? declare module 是为了告诉 tsc 这是一个“模块”。 如果不声明, IDE 里因为 tsc 类型检查, lint 会标红。 但vue-loader 是在 Webpack 构建阶段使…...
C/C++基础知识复习(30)
1) 什么是 C 中的 Lambda 表达式?它的作用是什么? Lambda 表达式: 在 C 中,Lambda 表达式是一种可以定义匿名函数的机制,可以在代码中快速创建一个内联的函数对象,而不需要显式地定义一个函数。Lambda 表…...

【NLP 1、人工智能与NLP简介】
人人都不看好你,可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg:特定场景下的文本分类、垂直领域下的对…...

网络安全事件管理
一、背景 信息化技术的迅速发展已经极大地改变了人们的生活,网络安全威胁也日益多元化和复杂化。传统的网络安全防护手段难以应对当前繁杂的网络安全问题,构建主动防御的安全整体解决方案将更有利于防范未知的网络安全威胁。 国内外的安全事件在不断增…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...