嵌入式C语言面试相关知识——关键字(不定期更新)

嵌入式C语言面试相关知识——关键字

  • 一、博客声明
  • 二、C语言关键字
    • 1、sizeof关键字
    • 2、static关键字
    • 3、const关键字
    • 4、volatile关键字
    • 5、extern关键字

一、博客声明

  又是一年一度的秋招,怎么能只刷笔试题目呢,面试题目也得看,想当好厂的牛马其实也不容易呀O(∩_∩)O。注意:这篇博客大部分是来自网上的资源,我只是为了加深印象,总结和抄一遍,没错,就是抄一遍,相关链接放在下面。

借鉴内容链接:C语言关键字,不为人知的细节解读


二、C语言关键字

1、sizeof关键字

  sizeof在面试中会经常结合strlen()一起问它们之间的区别,虽然它们都是与计算内存大小有关,但是他们的作用是不相同的。两者的区别在于:

  • sizeof是一个运算符;而strlen()是一个函数
  • sizeof计算的是变量或类型所占用的内存字节大小;而strlen()计算的是字符串中字符的个数,或者说是字符数组中元素的个数
  • sizeof的语法是sizeof(data type),即sizeof可以用于计算任何类型的数据;而strlen()的语法是strlen(const char* str),即只能用于计算字符串或者字符数组。
  • sizeof如果计算字符串的长度,会把末尾的字符串结束符\0也计算上;strlen()计算时,不会包含末尾的字符结束符\0。也就是说,用它们去计算字符串Hello的长度,前者的结果是6,而后者的结果是5

2、static关键字

  面试中会被经常问这个关键字的作用,如下:

  • 在修饰局部变量时,static修饰的静态局部变量有且只执行一次初始化任务,所以静态局部变量每次被幅值都会保存。而且延长了局部变量的生命周期,直到程序运行解释后才会被释放。即静态局部变量所在的.c文件运行结束才会被释放,而普通的局部变量在它所在的函数调用结束后就被释放了。还有一点是,普通局部变量被存放在RAM中的 栈(Stack) 区域,被static修饰的静态局部变量被采访在 数据段(data) 区域。
  • 在修饰全局变量时,这个全局变量只能在本文件中访问,也就是限定了其作用域,不能在其他文件中进行访问,即便是使用extern外部声明也不可行。
  • 在修饰函数时,也是会被限定其作用域,被修饰的函数只能在本文件中调用,不能被其他文件调用。
  • static修饰的变量采访在全局数据区的静态变量区,包括全局静态变量和局部静态变量,均在全局数据区分配内存。初始化的时候自动初始化为0。

tips:externstatic不能同时使用;因为用static修饰的全局变量被限定了作用域,所以其他文件中可以有同名的全局变量被定义声明。
在这里插入图片描述

3、const关键字

  该关键字在面试中经常被问其作用,也会被问到与#define的区别。

  • 作用: 用于定义只读变量,即如果一个变量被const修饰,那么它的值将无法再被更改。值得注意的是,const定义的是变量,而不是常量。在C99标准中,const定义的变量是全局变量,存放在全局数据区。此外,用const修饰变量时,一定要给变量初始化幅值,否者编译器会报错。
  • 与#define的区别:
    1、const常量有数据类型,而宏定义常量没有数据类型,只是简单的文本替换。因此,前者会有类型检查,而后者没有;
    2、const常量有作用域,只在它定义的作用域中有效,而宏定义常量没有作用域,可以在文件的任何地方使用。

4、volatile关键字

  该关键字经常被问到作用和理解。
  了解这个关键字之前,我们需要了解一下编译器的一个优化操作。由于内存访问的数据远不及CPU处理速度,为了提高存取速度,编译器优化时会把内存变量缓冲到寄存器中,若变量由其他程序所改变,其内存中的值会发生改变,而寄存器中的值不会改变, 将出现不一样的现象。volatile单词的意思就是易变的,当修饰变量时,就会告诉编译器,这个变量容易因为其他原因被发生改变,因此编译器每次读取的时候都从原始地址中进读取。作用如下:

  • 告诉编译器不要缓冲变量: 当你将一个变量声明为volatile时,编译器会知道这个变量可能在任何时候被外部因素(如硬件、中断服务程序、线程等)改变,因此被volatile修饰后,编译器不会对这个变量执行优化操作。
  • 确保每次访问都是直接从内存中进行读取: 每次读取volatile时,编译器都会生成代码从内存中读取该变量的值,而不是使用之前储存在寄存器或者其他地方的值。
  • 在多线程和硬件交互特别有用: 在多线程环境中,一个线程可能正在修改一个变量,而另外一个线程正在读取该变量。如果不使用volatile进行修饰,编译器可能会优化读取操作,导致读取到的是旧值。同样,当与硬件交互时,硬件可能会在任何时候改变某个内存位置中的值,因此也需要使用volatile来确保读取到的是最新的值。

5、extern关键字

  该关键字经常被用到作用。

  • 当在多个源文件中共享全局变量时,通常在一个源文件中定义该变量(即分配储存空间),而在其他源文件中使用extern声明该变量,以便能够访问它。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

golang结合neo4j实现权限功能设计

neo4j 是非关系型数据库之图形数据库,这里不再赘述。 传统关系数据库基于rbac实现权限, user ---- role ------permission,加上中间表共5张表。 如果再添上部门的概念:用户属于部门,部门拥有 角色,则又多了一层: user-…

小暑节气,选对劳保鞋,让安全与清凉同行

在七月炽热的阳光下,我们迎来了二十四节气中的小暑,标志着盛夏时节的正式开始。随着气温的节节攀升,不仅大自然万物进入了生长的旺季,我们的工作与日常生活也面临着新的挑战——如何在高温环境下保障自身安全,成为了不…

计算机网络——数据链路层(以太网)

目录 局域网的数据链路层 局域网可按照网络拓扑分类 局域网与共享信道 以太网的两个主要标准 适配器与mac地址 适配器的组成与运作 MAC地址 MAC地址的详细介绍 局域网的mac地址格式 mac地址的发送顺序 单播、多播,广播mac地址 mac帧 如何取用…

Spring源码十四:Spring生命周期

上一篇我们在Spring源码十三:非懒加载单例Bean中看到了Spring会在refresh方法中去调用我们的finishBeanFactoryInitialization方法去实例化,所有非懒加载器单例的bean。并实例化后的实例放到单例缓存中。到此我们refresh方法已经接近尾声。 Spring的生命…

提升系统稳定性:熔断、降级和限流策略详解

文章目录 前言一、熔断(Circuit Breaker)二、降级(Degradation)三、限流(Rate Limiting)四、应用案例五、小结推荐阅读 前言 随着互联网业务的快速发展,系统稳定性和高可用性成为现代分布式系统…

【Python机器学习】算法链与管道——网格搜索预处理步骤与模型参数

我们可以利用管道将机器学习工作流程中的所有处理步骤封装成一个scikit-learn估计器。这么做的好处在于:现在我们可以使用监督任务(分类或回归)的输出来调节预处理参数。 下面用一个管道来完成一个建模过程。管道包含了3个步骤:缩…

ELK优化之Filebeat部署

目录 1.安装配置Nginx 2.安装 Filebeat 3.设置 filebeat 的主配置文件 4.修改Logstash配置 5.启动配置 6.kibana验证 主机名ip地址主要软件es01192.168.9.114ElasticSearches02192.168.9.115ElasticSearches03192.168.9.116ElasticSearch、Kibananginx01192.168.9.113ng…

【C语言】register 关键字

在C语言中,register关键字用于提示编译器将变量尽量存储在CPU的寄存器中,而不是在内存中。这是为了提高访问速度,因为寄存器的访问速度比内存快得多。使用register关键字的变量通常是频繁使用的局部变量。 基本用法 void example() {regist…

iOS多target时怎么对InfoPlist进行国际化

由于不同target要显示不同的App名称、不同的权限提示语,国际化InfoPlist文件必须创建名称为InfoPlist.strings的文件,那么多个target时怎么进行国际化呢?步骤如下: 一、首先我们在项目根目录创建不同的文件夹对应多个不同的targe…

自闭症儿童的治疗方法有哪些?

身为星贝育园自闭症儿童康复学校的资深教育者,我深知自闭症谱系障碍(ASD)儿童的教育与治疗需要一个全面、个性化的方案。在星贝育园,我们致力于为孩子们提供一个充满爱与理解的环境,采用多种科学验证的教育方法&#x…

商贸物流大脑:大模型+数据要素赋能智慧物流数据平台

项目背景与意义 物流行业快速发展,数据量急剧增加,随着电子商务、智能制造等领域的快速发展,物流行业面领着前所未有的挑战和机遇,如效率低下、资源配置不均、信息不透明等问题。随着全球化和电子商务的快速发展,数据…

Arthas实战(5)- 项目性能调优

1、接口耗时查询:trace命令 trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。 1.1 准备测试应用 新建一个 SpringBoot 应用,写一耗时久的代码&…

编写优雅Python代码的20个最佳实践

想要让你的代码像艺术品一样既实用又赏心悦目吗?今天我们就来聊聊如何通过20个小技巧,让你的Python代码从平凡走向优雅,让同行看了都忍不住点赞! **温馨提示:更多的编程资料,领取方式在: 1. 拥…

《基于 defineProperty 实现前端运行时变量检测》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,欢迎多多交流~ &am…

209.力扣每日一题:质数的最大距离

代码解决 class Solution { public:// 判断一个数是否为质数bool isPrime(int n) {if (n < 1) {return false;}if (n < 3) {return true;}if (n % 2 0 || n % 3 0) {return false;}for (int i 5; i * i < n; i 6) {if (n % i 0 || n % (i 2) 0) {return false;…

C生万物之文件操作

文章目录 一、为什么使用文件&#xff1f;二、什么是文件&#xff1f;1、程序文件2、数据文件3、文件名 三、文件的打开和关闭1、文件指针2、文件的打开和关闭 四、文件的顺序读写1. 8个重要的库函数1.1 单字符输入输出【fputc和fgetc】1.2 文本行输入输出【fputs和fgets】1.3 …

API Object设计模式

API测试面临的问题 API测试由于编写简单&#xff0c;以及较高的稳定性&#xff0c;许多公司都以不同工具和框架维护API自动化测试。我们基于seldom框架也积累了几千条自动化用例。 •简单的用例 import seldomclass TestRequest(seldom.TestCase):def test_post_method(self…

固态,机械,移动(U盘),sd卡,哪个更适合长期储存数据 保存数据用什么硬盘可靠 硬盘数据丢失怎么找回 硬盘维护注意事项

有关硬盘数据丢失的恢复技巧&#xff0c;这篇文章一定要收藏好。在硬盘使用过程中&#xff0c;很多情况都会导致数据丢失&#xff0c;例如硬盘跌落、病毒感染、系统文件损坏等。这时候&#xff0c;一定要采用正确的方法&#xff0c;抢救硬盘中存储的珍贵数据和文档。 有关长期保…

如何选择最佳的照片和视频恢复软件

您是否意外从硬盘或 USB 卡中删除了照片或视频&#xff1f;最好的视频和照片恢复软件可以帮到您&#xff01;如果您一直在寻找最好的照片恢复软件&#xff0c;那么您来对地方了。本文将分享一些帮助您找到最佳视频恢复软件的提示。 重要提示&#xff1a;事实&#xff1a;媒体文…

【Qt5.12.9】程序无法显示照片问题(已解决)

问题记录&#xff1a;Qt5.12.9下无法显示照片 我的工程名为03_qpainter&#xff0c;照片cd.png存放在工程目录下的image文件夹中。 /03_qpainter/image/cd.png 因为这是正点原子Linux下Qt书籍中的例程&#xff0c;在通过学习其配套的例程中的项目&#xff0c;发现我的项目少…