static、const、volatile

2023-11-01

4、关键字static的作用是什么?

解答:在C语言中,关键字static有三个明显的作用:

 

  • 在函数体中,一个被声明为静态的变量在这一函数被调用过程中只会被分配一次内存,且整个运行期间不会重新分配;
  • 在函数体外、某个源文件内,一个被声明为静态的变量只可被该源文件内的所有函数访问,但不能被其他源文件的函数访问。它是一个本地的全局变量;
  • 在某个源文件内,一个被声明为静态的函数仅仅只可以被这个源文件的其它函数调用。也就是说,这个函数被限制在声明它的源文件的本地范围之内使用。

 

6.关键字const有什么含意?

答案:const意味着"只读"。

如果回答"const意味着常数",面试官会觉得你只是一个业余的人。

7.下面的声明都是什么意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

答案:

A.前两个的作用是一样,a是一个常整型数;

B.第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以);

C.第四个意思a是一个指向整型 数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的);

D.最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数 是不可修改的,同时指针也是不可修改的)。
 

  • const定义的变量,它的值不能被改变,在整个作用域中都保持固定;
  • 同宏定义一样,可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改;
  • 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。const是通过编译器在编译的时候执行检查来确保实现的。

const与指针

下面的声明都是什么意思:

 const int a;

int const a;

const int *a;

int * const a;

const int * const a;

int const * const a;

 

  • 前两个的作用是一样,a是一个常整型数;
  • 第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以);
  • 第四个意思a是一个指向整型 数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的);
  • 最后两个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数 是不可修改的,同时指针也是不可修改的)。

const与函数

 

  • const 通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针指向的数据,就可以用 const 来限制。比如在String的程序中有很多const修饰形参的情况:
void StringCopy(char* strDestination, const char *strSource);

 

  • const还可以表示该函数返回一个常量,放在函数的返回值的位置。比如:
const char * GetString(void);

 

  • 在类成员函数的声明和定义中,const放在函数的参数表之后,函数体之前,表示该函数的this指针是一个常量,不能修改该对象的数据成员。比如:
void getId() const;

6、关键字volatile有什么含意?并给出三个不同的例子。

解答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

 

  • 存储器映射的硬件寄存器通常也要加voliate,因为每次对它的读写都可能有不同意义;
  • 在中断函数中的交互变量,一定要加上volatile关键字修饰,这样每次读取非自动存储类型的值(全局变量,静态变量)都是在其内存地址中读取的,确保是我们想要的数据;
  • 多任务环境下各任务间共享的标志应该加volatile。

一个参数既可以是const还可以是volatile吗?

可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。软件不能改变,并不意味着我硬件不能改变你的值,这就是单片机中的应用。

参考文章:C语言中的volatile——让我保持原样

一个指针可以是volatile 吗?

可以。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

下面的函数有什么错误:

 int square(volatile int *ptr)

{

return *ptr * *ptr;

}

这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

 int square(volatile int *ptr)

{

int a,b;

a = *ptr;

b = *ptr;

return a * b;

}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

 long square(volatile int *ptr)

{

int a;

a = *ptr;

return a * a;

}

7、给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3。

解答:这道题清除a的bit3,使用“&=~”的方法。

 #define BIT3 (0x1 << 3)

static int a;


void set_bit3(void)

{

a |= BIT3;

}

void clear_bit3(void)

{

a &= ~BIT3;

}

8、嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。

解答:这一问题测试你是否知道为了访问一绝对地址,把一个整型数(绝对地址)强制转换为一指针是合法的。

 int *ptr;

ptr = (int *)0x67a9;

*ptr = 0xaa66;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

static、const、volatile 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • Bugku:社工-进阶收集

    Bugku过年上了几道新的社工题 有空了来试着写看看 先打开附件可以发现存在一张空间截图 盲猜应该是西安的 烂怂 大雁塔吧 从评论中主角和朋友的对话 我们大概可以获得以下信息 主角家距离大雁塔一共有七站地铁 其中要进行中转 同时作者是从始发
  • 在C#中使用OpenCV(使用OpenCVSharp)

    1 什么是OpenCVSharp 为了解决在Csharp下编写OpenCV程序的问题 我做过比较深入的研究 并且实现了高效可用的方法 GOCW 这几天在搜集资料的时候 偶尔看见了OpenCVSharp 从时间上来看 它已经经过了更久的发展
  • Unity中几种简单的相机跟随

    unity中相机追随 固定相机跟随 这种相机有一个参考对象 它会保持与该参考对象固定的位置 跟随改参考对象发生移动 using UnityEngine using System Collections public class Camera
  • Memcached 清除缓存命令

    首先打开cmd窗口 输入一下命令清除memcached缓存 1 连接 telnet 127 0 0 1 11211 2 查看状态 stats 3 清除缓存 flush all 显示ok以后 缓存就清理成功啦
  • 罗技驱动检测不到设备?解决方法

    罗技旗下的鼠标是很多用户都在使用的设备 需要用户安装驱动程序才能够运行 而近期有些小伙伴遇到了罗技驱动检测不到设备的情况 这该如何处理 纯净之家 win7纯净版系统 win7 ghost 纯净版 方法一 1 检测不到设备也有可能不是驱动的问
  • Linux的正则表达式

    目录 正则简介 正则三剑客一 grep 正则三剑客二 sed 正则三剑客三 awk 1 正则简介 什么是正则表达式 简单的说 正则表达式就是为处理大量的字符串而定义的一套规则和方法 通过定义的这些特殊符号的辅助 系统管理员就可以快速过滤 替
  • Linux命令 chmod -R 755

    linux 命令chmod 755的意思 chmod是Linux下设置文件权限的命令 后面的数字表示不同用户或用户组的权限 一般是三个数字 第一个数字表示文件所有者的权限 第二个数字表示与文件所有者同属一个用户组的其他用户的权限 第三个数字
  • 【django】Forbidden (CSRF cookie not set.)

    CSRF 表示django全局发送post请求均需要字符串验证 功能 防止跨站请求伪造的功能 工作原理 客户端访问服务器端 在服务器端正常返回给客户端数据的时候 而外返回给客户端一段字符串 等到客户端下次访问服务器端时 服务器端会到客户端查
  • 面试——Unity Animation和Animator的区别

    两者都是控制动画播放的 Animation控制一个动画播放的各类方法和数据 当然你可以通过修改目标动画进行动画切换 Animator则可以实现控制多个动画的播放 切换 叠加等一级对骨骼动画控制等更复杂的效果 是一个动画状态机 除却必要的动画
  • nmon命令

    启动nmon监控命令 日志保存到 log 路径下 nmon16g x86 sles12 s0 5 c14400 f m log 对nmon文件赋权 chmod 777 file name s 采集时间 c 采集次数 f 文件类型 不填写为标
  • 线程池 (通俗易懂)

    线程池 一 线程池是什么 二 标准库中的线程池 三 线程池的执行流程 四 实现线程池 3 1 思路与细节 3 2 完整代码 五 标准库里的构造方法 六 延伸问题 一 线程池是什么 之前我们已经认识过 池 String 字符串常量池 MySQ
  • Java并发编程

    发一定比串行快么 这个问题肯定是错的 并发比串行慢的原因在于 线程有创建和上下文切换的开销 上下文切换 即使是单核处理器也支持多线程执行代码 CPU通过给每个线程分配CPU时间片来实现这个机制 CPU通过时间片分配的算法来循环执行任务 当前
  • SpringBoot入门

    目录 一 微服务 什么是微服务 发展历程 单体应用程序 垂直应用架构 分布式架构 SOA架构 微服务架构 单体应用程序 垂直应用架构 分布式架构 SOA架构 微服务架构 二 构建SpringBoot项目 三 基于配置文件的注入 四 多环境配
  • 三方协议接收节点不存在_【汇总】缴款失败找不到原因?申报姐带你解读“神秘”代码!...

    然后 我们来看看缴款失败的提示页面 页面中有错误代码和中文的错误信息 申报姐根据这两个信息对缴款失败的情况总结如下 1 错误代码为F02 错误信息为与国库通讯超时通讯故障 解决方法 请稍后再尝试 重新缴款 2 错误代码为FG1 错误信息为征
  • 使用SOAtest进行功能回归测试,作为持续集成过程的一部分

    实现速度 同时保护您的应用程序不受退步影响 持续集成 CI 是一种广为人知且 在这一点上 被广泛采用的实践 它是显著提高应用交付速度的必要第一步 持续集成允许开发人员将他们的变更推送到源代码的 主 分支中 一个开发人员可能在一天内向主分支推
  • 电路仿真软件LTspice 使用教程

    目录 一 LTspice 特点 二 获取方式 三 运行演示电路 四 自绘电路 五 操作要点 六 相关链接 一 LTspice 特点 1 免费 2 电源快速仿真 3 涵盖大量ADI产品模型 二 获取方式 LTspice信息中心 亚德诺半导体
  • 前端如何调用后端接口?有哪几种方式?

    一般来讲 前端不会给后端接口 而是后端给前端接口的情况比较普遍 一些人可能不理解接口和前端开发的关系 其实不合适的接口设计会极大地影响用户的页面体验 那么今天就跟着我一起来看看 前端如何调用后端接口 有哪几种方式 首先 要弄清楚前端提供一个
  • Leetcode 09/04 每日一题 (257. 二叉树的所有路径 )

    给定一个二叉树 返回所有从根节点到叶子节点的路径 说明 叶子节点是指没有子节点的节点 示例 输入 1 2 3 5 输出 1 gt 2 gt 5 1 gt 3 解释 所有根节点到叶子节点的路径为 1 gt 2 gt 5 1 gt 3 思路与算
  • android mtk分析,MTK android平台LCD 驱动的代码分析与讲解

    http blog csdn net sunweizhong1024 article details 8447915 MTK LCD Driver 代码的路是在 mediatek source kernel driver vedio mtk
  • static、const、volatile

    4 关键字static的作用是什么 解答 在C语言中 关键字static有三个明显的作用 在函数体中 一个被声明为静态的变量在这一函数被调用过程中只会被分配一次内存 且整个运行期间不会重新分配 在函数体外 某个源文件内 一个被声明为静态的变