嵌入式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.mzph.cn/pingmian/42034.shtml

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

相关文章

快速上手指南:使用 Minikube 在本地运行 Kubernetes 集群

前言 Minikube 是一个开源工具,用于在本地运行 Kubernetes 集群。它提供了一种简单的方法来在本地开发和测试 Kubernetes 应用程序,而无需设置完整的 Kubernetes 集群。以下是 Minikube 的基本使用步骤: 安装 Minikube 安装依赖项 虚拟化…

java之静态方法

如果要在类中使用方法,就得需要将这个类实例化。有时候希望在不创建对象的情况下,通过类名直接调用某个方法,就得需要静态方法,要实现静态方法,只需要再成员方法前加上static关键字 静态方法也可以通过类名和对象访问…

Charles拦截发送数据包-cnblog

Charles拦截发送数据包 打开允许断点 右键要打断点的数据包,打断点 重新发请求进入断点模式 修改完毕后发送

拦截HTTP的多种方式

部分场景下需要修改请求报文信息,可以利用 AOP 思维(切面编程),对请求进行拦截处理。Web 中有见的几种发送请求的方式: XMLHttpRequestfetchwindow.navigator.sendBeaconnew Imageservice worker 针对这几种不同的场…

C++实现简化版Qt的QObject(3):增加父子关系、属性系统

前几天写了文章: C实现一个简单的Qt信号槽机制 C实现简化版Qt信号槽机制(2):增加内存安全保障 之后感觉还不够过瘾,Qt中的QObject体系里还有不少功能特性没有实现。为了提高QObject的还原度,今天我们将父子…

2024.06.29校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、实习 | 中国汽研2025届实习生招募 实习 | 中国汽研2025届实习生招募 2、开放周 | 航天513所暑期实践开放周邀请函 开放周 | 航天513所暑期实践开放周邀请函 3、开放日 | 中国电科第四…

vscode远程连接linux(配置免密)

远程连接 1.首先保证物理机和虚拟机网络可以ping通 2.查看ubuntu得ip地址 ifconfig IP为:192.168.52.133 3.连接远程主机 配置免密 1.打开cmd运行ssh-keygen -t rsa 一路回车就行 2.打开window文件夹C:\Users\xbj\.ssh 3.用记事本打开id_rsa.pub文件复制公…

LeetCode刷题之搜索二维矩阵

2024 7/5 一如既往的晴天,分享几张拍的照片嘿嘿,好几天没做题了,在徘徊、踌躇、踱步。蝉鸣的有些聒噪了,栀子花花苞也都掉落啦,今天给他剪了枝,接回一楼来了。ok,做题啦! 图1、宿舍…

数据结构之“栈”(全方位认识)

🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:数据结构 前言 栈是一种数据结构,具有" 后进先出 "的特点 或者也可见说是 ” 先进后出 “。大家一起加油吧冲冲冲!! …

玩转springboot之springboot注册servlet

springboot注册servlet 有时候在springboot中依然需要注册servlet,filter,listener,就以servlet为例来进行说明,另外两个也都类似 使用WebServlet注解 在servlet3.0之后,servlet注册支持注解注册,而不需要在…

解决vscode配置C++编译带有中文名称报错问题

在新电脑上安装vscode运行带有中文路径和中文名称的C代码时遇到报错 根据别人的教程将laugh.json文件中"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",改成了"program": "${fileDirname}\\output\\test.exe",&#x…

文化财经macd顶底背离幅图指标公式源码

DIFF:EMA(CLOSE,12) - EMA(CLOSE,26); DEA:EMA(DIFF,9); MACD:2*(DIFF-DEA),COLORSTICK; JC:CROSS(DIFF,DEA); SC:CROSSDOWN(DIFF,DEA); N1:BARSLAST(JC)1; N2:BARSLAST(SC)1; HH:VALUEWHEN(CROSSDOWN(DIFF,DEA),HHV(H,N1));//上次MACD红柱期间合约最大值 HH2:VALUEWHE…

PyQT动态加载ui文件时,如何继承QMainWindow类

主要看mywindow类的写法 不继承时一般这样加载ui文件来创建一个界面: from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBox, QWidget from PyQt5.uic import loadUiclass MyWindow():def __init__(self):self.ui loadUi("your_ui.ui"…

docker部署mycat,连接上面一篇的一主二从mysql

一、docker下载mycat镜像 查看安装结果 这个名称太长,在安装容器时不方便操作,设置标签为mycat docker tag longhronshens/mycat-docker mycat 二、安装容器 先安装一个,主要目的是获得配置文件 docker run -it -d --name mycat -p 8066:…

记一次使用“try-with-resources“的语法导致的BUG

背景描述 最近使用try-catch的时候遇到了一个问题,背景是这样的:当第一次与数据库建立连接以后执行查询完毕并没有手动关闭连接,但是当我第二次获取连接的时候报错了,显示数据库连接失败,连接已经关闭。 org.postgres…

nginx(三)—从Nginx配置熟悉Nginx功能

一、 Nginx配置文件结构 ... #全局块events { #events块... }http #http块 {... #http全局块server #server块{ ... #server全局块location [PATTERN] #location块{...}location [PATTERN] {...}}server{...}... #http全局块 …

Go 语言入门(一)

Go Modules依赖包查找机制 下载的第三方的依赖存储在 $GOPATH/pkg/mod 下go install 生成的可执行文件存储在 $GOPATH/bin下依赖查找顺序: 工作目录$GOPATH/pkg/mod$GOPATH/src 一、Go语言基础 1.标识符与关键字 1.1 命名方式 ​ go变量、常量、自定义类型、包…

Synchronized、volatile与ReentrantLock:Java并发编程中的同步机制比较

在Java并发编程中,确保多个线程安全地访问共享资源是至关重要的一环。Synchronized、volatile与ReentrantLock是三种常用的同步机制,它们各有特点和应用场景。下面从技术难点、面试官关注点以及回答吸引力三个方面详细比较这三种机制。 技术难点 Synch…

怎样把自己电脑ip改成动态ip:步骤与解析

在今天的网络世界中,IP地址是计算机与互联网沟通的桥梁。而动态IP地址,作为其中的一种类型,由于其自动分配和管理的特性,为用户提供了更大的便利性和灵活性。那么,您是否想知道怎样将电脑IP改为动态呢?本文…

【C++PCL】点云处理两组点云的最小距离

作者:迅卓科技 简介:本人从事过多项点云项目,并且负责的项目均已得到好评! 公众号:迅卓科技,一个可以让您可以学习点云的好地方 重点:每个模块都有参数如何调试的讲解,即调试某个参数对结果的影响是什么,大家有问题可以评论哈,如果文章有错误的地方,欢迎来指出错误的…