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

C语言面试最常问的三个关键字

文章目录

  • 前言
  • 一,static关键字的作用
  • 二,const 关键字的作用
    • 2.1, 修饰局部变量
    • 2.2,修饰指针
    • 2.3, 修饰函数形参
    • 2.4,修饰函数的返回值
  • 三,volatile关键字的作用


前言

面试的时候,C语言最常问的三个关键字:static、const、volatile的作用,你是否能回答完整呢?


一,static关键字的作用

  • 修饰局部变量,会改变局部变量的生命周期,不改变作用域(在函数执行完后,该静态局部变量还在,不会被释放,但不能在其它地方使用);静态局部变量的初始化只会执行一次
  • 修饰全局变量,表示该全局变量只能在本文件使用,不能跨文件使用
  • 修饰函数,表示该函数只能在本文件中使用,不能跨文件使用

static修饰的变量存放在静态存储区,会默认初始化为0,而且修饰的全局变量和函数只能在本文件中使用,可防止重名。

二,const 关键字的作用

const 是 constant 的缩写,意思是“恒定不变的”!用来定义只读变量的,或者说 const 是定义常量的关键字

2.1, 修饰局部变量

被修饰变量的值不能改变。用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了。

const int i = 10;        //正确
int const i = 10        // 正确,这两种写法是等价的
i = 20;                //错误,常量值不可被改变
const int j;          //错误,未被初始化

2.2,修饰指针

可以指定指针本身为const,也可以指定指针所指的数据为const
常量指针,本质上是个指针,指针指向的内容是常量,指针本身是可以变的,可指向其他地址

int a = 5;
int b = 10;
const int* n = &a;
int const* n = &a;  //这两种定义方式都是一样的,表示常量指针
*n = 6;  //错误,不能改变 n所指向对象的值
a = 6;  //正确,不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。
n = &b;  //正确,常量指针指向的指不能改变,但指针可变,可指向其他地址

指针常量,本质上是个常量,表示常量是个指针类型,不能再指向其他的地址,指向的内容可变

int nValue1 = 10;
int nValue2 = 20;
int* const constPoint = &nValue1;
//constPoint = & nValue2;  //错误,不能改变constPoint本身的值
*constPoint = 40;  //正确,可以改变constPoint所指向的对象,此时nValue1 = 40

指向常量的常指针
是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。

const int nConstValue1 = 5;
const int nConstValue2 = 15;
const int* const pPoint = &nConstValue1;
//*pPoint  = 55;  //错误,不能改变pPoint所指向对象的值
//pPoint = &nConstValue2;  //错误,不能改变pPoint本身的值

const助记方法
把一个声明从右向左读。( * 读成 pointer to )

char * const cp;  // cp is a const pointer to char
const char * p;   // p is a pointer to const char;
char const * p;   // 同上

2.3, 修饰函数形参

根据常量指针与指针常量,const修饰函数的参数也是分为三种情况

  • 防止修改指针指向的内容
    void StringCopy(char* strDes, const char* strSrc);
    其中 strSrc是输入参数,strDes是输出参数。给 strSrc 加上 const 修饰后,如果函数体内的语句试图改动 strSrc 的内容,编译器将指出错误。
  • 防止修改指针指向的地址
void swap ( int* const p1 , int* const p2 )

指针p1和指针p2指向的地址都不能修改。

  • 以上两种的结合。
void swap ( int* const p1 , const int* const p2 )

2.4,修饰函数的返回值

如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
举个例子:

const char* GetString(void);
char* str = GetString(); // 错误,会出现编译错误
const char* str = GetString();  // 正确,类型要一致

三,volatile关键字的作用

volatile 本意是“易变的”,指变量是随时可能发生变化的。系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。即变量前加这个关键字,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问

  • 存储器映射的硬件寄存器
  • 一个中断服务程序中修改的供其它程序检测的变量
  • 多线程中各任务间共享的变量,可以关闭系统调度
    这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在a)中只能依靠硬件的良好设计,b)中可以通过关中断来实现,c)中禁止任务调度。

编译器的优化:

在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。
当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。
当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。

其他问题
1)一个参数既可以是const还可以是volatile吗?
可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2) 一个指针可以是volatile 吗?
可以,当一个中服务子程序修该一个指向一个buffer的指针时。

相关文章:

C语言面试最常问的三个关键字

文章目录前言一,static关键字的作用二,const 关键字的作用2.1, 修饰局部变量2.2,修饰指针2.3, 修饰函数形参2.4,修饰函数的返回值三,volatile关键字的作用前言 面试的时候,C语言最常…...

【Linux】-初识Linux

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【Linux】 分享:逆着光行走,任风吹雨打。 ——《起风了》 主要内容:Linux的一些最基本指令,Linux的小程序,Linux关于连…...

精选7个 Python 学习资源库,助你成为优秀的开发者

当你在学习编程时,很容易被大量的资源所吓到,不知道该从何开始。 GitHub 仓库是一个很好的起点,因为它们提供了一种非常实用的方式来了解实际的编程应用。你可以查看其他人的代码,并将其与自己的代码进行比较和学习。 当涉及到 …...

【大数据处理与可视化】三 、Pandas库的运用

【大数据处理与可视化】三 、Pandas库的运用实验目的实验内容实验步骤一、使用pandas库分别创建Series对象和DataFrame对象,并对创建的对象使用索引、排序等相关操作;练习DataFrame对象的统计计算和统计描述的功能。1&2、创建一个DataFrame(d…...

FPGA解码SDI视频任意尺寸缩放拼接输出 提供工程源码和技术支持

目录1、前言2、SDI理论练习3、设计思路和架构SDI摄像头Gv8601a单端转差GTX解串SDI解码VGA时序恢复YUV转RGB图像缩放FDMA图像缓存实现拼接HDMI驱动4、vivado工程详解5、上板调试验证并演示6、福利:工程代码的获取1、前言 FPGA实现SDI视频编解码目前有两种方案&#…...

线索二叉树结构

线索二叉树结构1.线索二插树的作用2.线索二叉树的定义3.线索二叉树的结构4. 线索二叉树的操作4.1. 建立一棵中序线索二叉树4.2. 在中序线索二叉树上查找任意结点的中序前驱结点4.3. 在中序线索二叉树上查找任意结点的中序后继结点4.4. 在中序线索二叉树上查找任意结点在先序下的…...

6.网络爬虫——BeautifulSoup详讲与实战

网络爬虫——BeautifulSoup详讲与实战BeautifulSoup简介:BS4下载安装BS4解析对象Tag节点遍历节点find_all()与find()find_all()find()豆瓣电影实战前言: 📝​📝​此专栏文章是专门针对网络爬虫基础,欢迎免费订阅&#…...

Vue:路由管理模式

三种模式 Vue.js 的路由管理有三种模式: Hash 模式(默认):在 URL 中使用 # 符号来管理路由。例如,http://example.com/#/about。这个模式的好处是可以避免浏览器向服务器发送不必要的请求,并且不需要特殊…...

7个最好的PDF编辑器,帮你像编辑Word一样编辑PDF

PDF 是具有数字思维的组织的重要交流工具。提供高效的工作流程和更好的安全性,可以创建重要文档并与客户、同事和员工共享。文档的布局已锁定,因此无论在什么设备上查看,格式都保持不变。这是让每个人保持一致的好方法——尤其是那些使用Micr…...

【数据结构】树的介绍

文章目录前言树的概念及结构树的概念树的表示树在实际中的运用二叉树的概念及结构二叉树的概念现实中的二叉树特殊的二叉树二叉树的性质二叉树的储存结构顺序存储链式存储写在最后前言 🚩本章给大家介绍一下树。树的难度相对于前面的数据结构来说,又高了…...

CoreDNS 性能优化

CoreDNS 作为 Kubernetes 集群的域名解析组件,如果性能不够可能会影响业务,本文介绍几种 CoreDNS 的性能优化手段。合理控制 CoreDNS 副本数考虑以下几种方式:根据集群规模预估 coredns 需要的副本数,直接调整 coredns deployment 的副本数:k…...

前端三剑客常见面试题及其答案

目录 1、什么是 HTML? 2、什么是 CSS? 3、什么是 JavaScript? 4、什么是盒模型? 5、什么是浮动? 6、什么是定位? 7、什么是选择器? 8、什么是事件? 前端的三剑客指的是 HTML…...

【DFS专题】深度优先搜索 “暴搜”优质题单推荐 10道题(C++ | 洛谷 | acwing)

文章目录题单一、模板 [极为重要]全排列DFS组合型DFS指数DFS二、专题烤鸡 (指数BFS)P1088 火星人 【全排列】P1149 火彩棒 [预处理 ]P2036 PERKETP1135 奇怪的电梯 暴力P1036 [NOIP2002 普及组] 选数 (组合)P1596 [USACO10OCT]Lake Counting …...

微信小程序自定义组件生命周期有哪些?

微信小程序自定义组件的生命周期函数分为三类: 创建时执行的生命周期函数、更新时执行的生命周期函数和销毁时执行的生命周期函数。 下面是具体的生命周期函数及其触发时机: 创建时执行的生命周期函数: created:在组件实例刚刚…...

Linux就该这么学(六)

一、从“/”开始 Linux 系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、rooT 均代表不同的目录,并且文件名称中不得包含斜杠(/)。Linux 系统中的文件存储结构如下图所示。 在 Linux 系统中,最常见的目录…...

目标检测算法——YOLOv5/v7/v8改进结合涨点Trick之Wise-IoU(超越CIOU/SIOU)

超越CIOU/SIOU | Wise-IoU助力YOLO强势涨点!!! 论文题目:Wise-IoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism 论文链接:https://arxiv.org/abs/2301.10051 ​ 近年来的研究大多假设训练数据中的…...

【蓝桥杯选拔赛真题39】python输出数字组合 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python输出数字组合 一、题目要求 1、编程实现 2、输入输出...

网络安全工程师做什么?

​ 网络安全很复杂。数字化转型、远程工作和不断变化的威胁形势需要不同的工具和不同的技能组合。 系统必须到位以保护端点、身份和无边界网络边界。负责处理这种复杂安全基础设施的工作角色是网络安全工程师。 简而言之,网络安全工程师是负责设计和实施组织安全系…...

总结:K8S运维常用命令

一、部署./kubectl apply -f biz-healing-pod.yaml 二、查看部署的资源1、podkubectl get pod -A:获取所有pod没有IP?用-o wide参数看详细信息:./kubectl get pod -n deepflow -o wide2、service查看hubble-manager命名空间下有哪些service/d…...

你是真的“C”——进行动态内存分配库函数的使用详解

你是真的“C”——申请动态空间库函数的使用详解😎前言🙌一、为什么需要动态内存分配?💞free 函数😘malloc 库函数😘calloc 库函数😘realloc 库函数😘总结撒花💞&#x1…...

Python|蓝桥杯进阶第五卷——数论

欢迎交流学习~~ 专栏: 蓝桥杯Python组刷题日寄 蓝桥杯进阶系列: 🏆 Python | 蓝桥杯进阶第一卷——字符串 🔎 Python | 蓝桥杯进阶第二卷——贪心 💝 Python | 蓝桥杯进阶第三卷——动态规划 ✈️ Python | 蓝桥杯进阶…...

用Python实现单例模式

什么是单例模式单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象…...

交叉编译说明:工具链安装和环境变量配置

目录 一 简单了解交叉编译 ① 什么是交叉编译 ② 为什么需要交叉编译 ③ 宿主机和目标机 二 搭建交叉编译工作环境 ① 安装工具链 ② 配置环境变量 ● 配置临时环境变量 ● 配置永久环境变量 三 交叉编译宿主机和目标机 ● 宿主机编译生成的可执行文件下载到目…...

文件上传的多种利用方式

文件上传的多种利用方式 文件上传漏洞除了可以通过绕过检测进行webshell的上传之外,还有多种其它的漏洞可以进行测试。 XSS漏洞 文件名造成的XSS 当上传任何文件时,文件名肯定是会反显示在网页上,可以使用 XSS Payload做文件名尝试将其上传到…...

盘一盘C++的类型描述符(二)

先序文章请看 盘一盘C的类型描述符(一) 稍微组合一下的复杂类型 数组指针类型的数组类型 数组的指针类型我们已经了解了,那么,以这种类型作为元素的数组类型怎么搞? using type int (*)[3]; // 元素类型是数组指针…...

慎投,Frontiers这本期刊显示on hold中

什么是“On Hold”? 该期刊因为质量问题正在被进行重新评估;在重新评估过程中,不会检索新发表的文章。该期刊因为质量问题正在被进行重新评估;在重新评估过程中,不会检索新发表的文章。根据选择标准,在最严…...

Winform控件开发(21)——ProgressBar(史上最全)

一、属性 1、Name 用于获取控件对象 2、Anchor 锚定控件对于父控件的位置 3、BackColor 背景色 4、ContextMenuStrip 关联的上下文菜单 5、Cursor 鼠标移动到控件上显示的光标 6、Dock 停靠在父控件的位置 7、Enabled 是否启动该控件,false时事件都不能触发 8、…...

校招失败后,在外包公司熬了 2 年终于进了字节跳动,竭尽全力....

其实两年前校招的时候就往字节投了一次简历,结果很明显凉了,随后这个理想就被暂时放下了,但是这个种子一直埋在心里这两年除了工作以外,也会坚持写博客,也因此结识了很多优秀的小伙伴,从他们身上学到了特别…...

UniApp + SpringBoot 实现接入支付宝支付功能和退款功能

一、支付宝开放平台设置 注册支付宝支付功能需要个体工商户或企业才可以!需要有营业执照才能去申请哦! 1、登录到控制台 进入支付宝开放平台 控制台 2、开发设置 3、产品绑定APP支付 如果没有绑定APP支付就会报商家订单参数异常,请重新发起…...

初识进程

文章目录一、进程的概念1. 进程是什么及进程的管理2. Linux 下的 pcb3. 系统调用接口 getpid 和 getppid4. 系统调用接口 fork一、进程的概念 1. 进程是什么及进程的管理 在 Linux下 ./binaryfile 运行一个程序或者在 Windows下双击运行一个程序时,程序就变成了一个…...

wordpress更新慢/百度在线翻译

计算机VB基础知识---知识导学VB基础知识---知识导学Viscal Basic语言一.算法1.定义:算法(Algorithm)就是解决某一类问题的方法和步骤。2.算法的五个重要特征:(1)输入:可以是0个或多个输入;算法可以没有输入。(2)输出:可…...

网站后台密码忘了/网站页面的优化

IT行业为啥这么吸引人?说白了就是高薪,容易进大厂。在一线城市的Java岗位,单拿应届生薪资水平来说,普遍在10k以上,最高也能达到30k以上,且涨薪幅度大,经常有程序员说自己的年薪达到50w&#xff…...

警告欺骗网站模板/百度app安装

目录 1. mysql深度解析 1.1. mysql架构解析1.2. mysql存储引擎 2. 索引 2.1. MySQL索引系统 2.1.1. 问题2.1.2. InnoDB的索引 2.2. 索引分类 2.2.1. 分类2.2.2. 索引解析2.2.3. 索引失效 3. 日志系统 1. mysql深度解析 参考: MySQL深度解析:mysq|架构体系、mysq…...

杭州高端网站制作/百度网盘网址

一、解释   DCpower一般是指带实际电压的源,其他的都是标号(在有些仿真软件中默认的把标号和源相连的)VDD:电源电压(单极器件);电源电压(4000系列数字电路);漏极电压(场效应管)VCC:电源电压(双极器件);电源电压(74系列数字电路);声控载波(VoiceControl…...

定远建设局网站/关键词优化排名的步骤

浏览器记住密码,怎么查看密码是什么? 听语音| 浏览:7891 | 更新:2015-01-28 14:26 | 标签:浏览器 1234567分步阅读现在浏览器都有一种功能叫记住密码,其实这样很不安全。 你眼睛看的那几个‘******’并没有…...

郑州网站建设系统培训/热点时事新闻

浅copy:import copyperson [a,b,[q,w]]p1 person.copy()p2 person[:]p3 copy.copy(person)p4 list(person) 深copy:p1 copy.deepcopy(person)浅copy和深copy的区别是:浅copy只copy内容不变的那一层,字符串、整数等类型都是不…...