嵌入式开发工程师面试题 - 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被正确地定义为指向一个接受intchar *参数并返回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复制代

  1. class B 定义了一个虚函数 Fun()

  2. class D 继承自 B 并重写了 Fun() 函数。

  3. 创建了一个 D 类型的对象 dd

  4. B* pb = ⅆ 创建了一个指向 dd 的 B 类型的指针 pb。由于 B 中的 Fun() 是虚函数,通过 pb 调用 Fun() 时,将发生动态绑定,实际调用的是 D 类中的 Fun()

  5. 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。


未完待续,持续更新!

以防后边找不到可以点赞收藏下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#面向对象,封装、继承、多态、委托与事件实例

一.面向对象封装性编程 创建一个控制台应用程序,要求: 1.定义一个服装类(Cloth),具体要求如下 (1)包含3个字段:服装品牌(mark),服装…

【springboot】读取外部的配置文件

【springboot】读取外部的配置文件 一、使用场景二、代码实现(一)application.yml 的配置(二)编辑 customer.yml(三)自定义方法读取外部配置文件(四)使用外部配置文件的配置 一、使用…

解锁 Vue 项目中 TSX 配置与应用简单攻略

在 Vue 项目中配置 TSX 写法 在 Vue 项目中使用 TSX 可以为我们带来更灵活、高效的开发体验,特别是在处理复杂组件逻辑和动态渲染时。以下是详细的配置步骤: 一、安装相关依赖 首先,我们需要在命令行中输入以下命令来安装 vitejs/plugin-v…

游戏引擎学习第22天

移除 DllMain() 并成功重新编译 以下是对内容的详细复述与总结: 问题和解决方案: 在编译过程中遇到了一些问题,特别是如何告知编译器不要退出程序,而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。原本尝试…

【C#设计模式(15)——命令模式(Command Pattern)】

前言 命令模式的关键通过将请求封装成一个对象,使命令的发送者和接收者解耦。这种方式能更方便地添加新的命令,如执行命令的排队、延迟、撤销和重做等操作。 代码 #region 基础的命令模式 //命令(抽象类) public abstract class …

QT6学习第四天 感受QT的文件编译

QT6学习第四天 感受QT的文件编译 使用纯代码编写程序新建工程 使用其他编辑器纯代码编写程序并在命令行运行使用 .ui 表单文件生成界面使用自定义 C 窗口类使用现成的QT Designer界面类 使用纯代码编写程序 我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局&#xff0c…

【SpringBoot】28 API接口防刷(Redis + 拦截器)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 常用的 API 安全措施包括:防火墙、验证码、鉴权、IP限制、数据加密、限流、监控、网关等,以确保接口的安全性。 常见措施 1)防火墙 防火墙是网络安全中最基本的安全设备之一&#xff0c…

4——单页面应用程序,vue-cli脚手架

单页面应用程序(英文名:Single Page Application)简称 SPA,顾名 思义,指的是一个 Web 网站中只有唯一的一个 HTML 页面,所有的功能与交互都在这唯一的一个页面内完成。 1、脚手架 ① 什么是脚手架 vue-cli 是 Vue.js 开发的标准工具。它简化了程序员基于 webpack …

小程序 - 个人简历

为了让招聘人员快速地认识自己,可以做一个“个人简历”微信小程序, 展示自己的个人信息。 下面将对“个人简历”微信小程序进行详细讲解。 目录 个人简历 创建图片目录 页面开发 index.wxml index.wxss 功能实现截图 总结 个人简历 创建图片目录…

BUUCTF—Reverse—helloword(6)

一道安卓逆向的签到题 下载附件 使用JADX-gui反编译工具打开(注意配环境),找到主函数 jadx 本身就是一个开源项目,源代码已经在 Github 上开源了 官方地址:GitHub - skylot/jadx: Dex to Java decompiler 发现flag …

单点登录深入详解之设计方案总结

基于cookie的单点登录解决方案 概述 用户登录之后 , 将认证信息存储至 Cookie ,当再次访问本服务或者访问其他应用服务时,直接从 Cookie 中传递认证信息,进行鉴权处理。 问题 1. 如何保障Cookie内用户认证信息的安全性? 第一, Cookie…

JSONArray 与Object 之间的转换

PageResult<JSONArray> pageResult new PageResult<>();// 查出来的数据 JSONArray resultArray new JSONArray(); ject data new JSONObject();data.put("code", code); resultArray.add(data);// 将resultArray数据放入JSONArray,不是再包装成一个 …

cangjie (仓颉) vscode环境搭建

sdk下载 下载中心-仓颉编程语言官网 可选择半年更新版&#xff0c;不用申请。目前版本&#xff1a;0.53.13 &#xff0c;选择不同平台压缩包下载解压到任意位置即可 补充下载&#xff0c;vscode插件解压后&#xff0c;在vscode扩展中选择从vsix安装&#xff0c;安装后新增名为…

SmartSQL:一款方便、快捷的数据库文档查询、导出工具

&#x1f6a9; 项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具&#xff01;从最初仅支持SqlServer数据库、CHM文档格式开始&#xff0c;通过不断地探索开发、集思广益和不断改进&#xff0c;又陆续支持Word、Excel、PDF、Html、Xml、Json、MarkDown等文档格式…

IT监控 | Oracle云监控全解析

Oracle云(Oracle Cloud)是Oracle公司提供的云服务平台&#xff0c;涵盖了IaaS、PaaS、SaaS和DaaS&#xff0c;支持企业在云中构建、部署、集成和扩展应用&#xff0c;为企业提供了管理服务器、应用程序、存储、网络和数据中心的全面控制能力。 跟踪Oracle云基础设施的关键组件将…

攻防世界-web ics-06 [解法思路]

进入环境 点击左边的列表只有报表中心有反应 注意看url直接就是index.php?id1 我先试了sqlmap不行&#xff0c;然后就沉淀了一下 想到了id后面的参数问题&#xff0c;我谁便改了几个数都没反应 就想着用bp抓包爆一下这个参数&#xff0c;用了一个数字10000的字典 发现2333…

zotero安卓测试版下载和使用

2023年年底&#xff0c;Zotero官方就已经推出了安卓版的测试版Zotero for Android (beta),&#xff0c;但名额有限且只能通过Google商店下载。此外&#xff0c;还有一些第三方开发的安卓应用&#xff0c;如Zoo for Zotero、ZotDroid等。 在首次使用Zotero安卓版时&#xff0c;用…

洛谷 P1722 矩阵 II C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/P1722 我们按照案例画一下 我们会发现&#xff0c;会出现重复的子结构。 代码如下&#xff1a; #include<iostream> using namespace std; int mem[300][300]; int n; int f[305][305]; int dfs(int x,int red,…

MCU(一) 时钟详解 —— 以 GD32E103 时钟树结构为例

微控制器 (MCU) 的时钟系统是系统运行的核心&#xff0c;它提供了各模块所需的时钟信号。本文以 GD32E103 系列 MCU 为例&#xff0c;详细讲解其 时钟树结构&#xff08;Clock Tree&#xff09;。通过理解时钟源、分配与预分频器设置&#xff0c;可以灵活配置系统时钟以实现高性…

[HarmonyOS] 解决HMRouter路由地址无法抽取的问题

解决HMRouter路由地址无法抽取的问题 背景 最近开始学习HarmonyOS开发&#xff0c;搭建项目的时候采用了 HMRouter 路由框架&#xff0c;在项目里使用到路由跳转&#xff0c;官方链接在这&#xff1a; https://gitee.com/hadss/hmrouter/blob/master/HMRouterLibrary/README…