面试高频关键字

文章目录

  • 前言
  • 一、static?
    • 1、static修饰全局变量
      • 总结:
    • 2、static修饰函数
      • 总结:
    • 3、static修饰局部变量
      • 总结
  • 二、const?
    • Ⅰ、 const修饰普通变量
    • Ⅱ、 const修饰指针变量
    • Ⅲ、 const修饰函数
      • 1、const修饰函数参数
      • 2、const 修饰函数返回值
    • Ⅳ、const修饰的变量与常量的区别
    • 总结
  • 三、volatile?
      • 总结


前言

在一些面试过程中。面试官们总喜欢问一些基础的问题来考验面试者们,而其中C语言关键字也是面试官们,爱问的,其中以static、const、volatile尤为爱问,接下来博主将和大家一起讨论一下,这几个常问的关键字;


提示:以下是本篇文章正文内容,下面案例可供参考

一、static?

关键字“static”,译成中文就是“静态的”;在C语言中static可以用来修饰全局变量,也可以用来修饰函数,还有局部变量;接下来,我们分别来讨论一下,static分别修饰这三个东西有什么“妙用”;

1、static修饰全局变量

在C语言中,每一个全局变量和函数都是具有外部链接属性,
什么是外部链接属性呢?
就打一个比分来说,在同一个项目中,我们在另一个源文件中定义的全局变量或者函数,如果我们想在另一个源文件使用的话,我们只需声明一下就可以在本文件内使用了;
比如这样:
在这里插入图片描述
以上述为例:有时候呢我们又不想我们在test.c文件里面定义的全局变量和函数被其他源文件使用;怎么办呢?通过对C语言关键字的理解,我们可以在全局变量的前面加一个static关键字加以修饰;这样呢,我们就切断了在test.c文件里面定义的全局变量的外部链接属性;我们也就限定了在test.c文件里面定义的全局变量,只能在本文件内使用,而不能被其他源文件啊给使用;
相当于这样:
在这里插入图片描述
在这里插入图片描述
这时候我们再在其他源文件里使用i_val编译器就会直接报错了,并且表示自己没有找到一个叫i_val的东西;

总结:

static修饰全局变量,会改变全局变量的作用域;但是不会改变全局变量的生命周期;

2、static修饰函数

static修饰函数其实和static差不多的,都是切断函数的外部链接属性,限定函数的使用范围;
未使用static修饰之前:
在这里插入图片描述
使用static修饰过后:
在这里插入图片描述
在这里插入图片描述
如果这时候我们硬是想在其他源文件内使用并调用fun函数但是又不能取消static修饰,我们有没有办法解决这个问题?答案是肯定的;
既然正面不行的话,我们就从侧面来呗.😁😁😁
我们不是说用static修饰的函数没有了外部链接属性嘛,只能在在本文件内使用嘛,那好!!我就依你,我就在本函数内调用你!!不过这个调是在本文件内在定义一个新函数,在新函数内调用这个被static修饰的函数,就比如这样:
在这里插入图片描述
那么到这步,可能你已经明白了下一步怎么做了;

我们这个新定义的函数没有被static修饰啊!,也就是说这个新函数的外部链接属性还在,那我们直接在其他源文件内调用这个新函数不就行了,也就相当于我们调到了那个被static修饰的函数;虽然是间接调用但是我们达到了相同的效果;
效果演示图:
在这里插入图片描述
其实这从侧面可以看出static还有另外一个功能:封装函数;
当你写的代码的过程不想被别人看见时,但是又得把函数接口提供给别人使用时,这是static是个不错的选择;

总结:

static修饰函数是会切断函数的外部链接属性的;说人话就是,限定你的函数只能在本源文件内使用,不能被其它源文件文件调用;

3、static修饰局部变量

我们先来看一段代码:

void fun(void)
{static val = 1;val++;printf("%d\n",val);
}int main()
{for(int i=0;i<5;i++)fun();return 0;
}

屏幕上会输出什么呢?
是5个2吗?
来我们运行一下:
在这里插入图片描述
运行结果是:2 3 4 5 6
分析:
我们常规的理解,不是说val是个临时变量吗,在函数调用结束的时候,val所开辟的空间不是被释放了嘛,第二次调用的时候又会重新给val赋值,那么打印出来不就应该是2 2 2 2 2 嘛。首先,我们有这个疑惑呢,说明你函数那块还可以哈!但是我们这道题与常规题不一样嘛,在val之前多了个static嘛,那我们就不能忽视了static的作用;在static修饰局部变量时,我们的变量其实并不会常规的在栈区(或者说栈帧)开辟空间,它会在一个叫静态区的地方开辟空间,并把数据放在静态区内;
什么时静态区?
简单点来说就是存放全局变量,常量的地方;在这上面存着的数据生命周期都很长(与程序共“长寿”);
那么这里为什么会打印2 3 4 5 6不就号解释了;
我的val并没有在栈上开辟空间;而是在静态区;故函数调用结束的时候,并不会销毁val,val中的值也就不会被清除掉,第二次调用的时候,val也不会重新开辟新空间了,直接取上次留下的值既行了;
无static修饰:
在这里插入图片描述
在这里插入图片描述
使用static修饰:
在这里插入图片描述
在这里插入图片描述

总结

static修饰局部变量,改变了局部变量的生命周期,并未改变局部变量的作用域;

二、const?

const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。

Ⅰ、 const修饰普通变量

在这里插入图片描述
很明显,被const修饰过的变量不能被直接改变;因为经过const修饰过的变量,只具有了可读性,没有了可写性,(或者说编译器不允许你修改);
既然正面不行,我们就来侧面呗;
我们从指针方面去改改试试:
在这里插入图片描述

很明显,我们成功了,但是我们必须注意一下上面用的强制转换,因为这左右两边的类型并不一样:
在这里插入图片描述
如果不加以强制转换的话就会报出以下警告:
在这里插入图片描述

Ⅱ、 const修饰指针变量

	  int num = 10;int*  p = &num;const int* p = &num;//1int const* p = &num;//2int* const p = &num;//3const int*const p = &num;//4

其中,我们的1,2种写法效果一样,因为关键字是不能修饰关键字的;
表达的意思就是我们不能通过解引用来改变num的值,(或者说*p对象的值,不能被更新)相当于我们把间接改变num值的路子给堵死了;
但是呢我们可以改变p里面的值;
在这里插入图片描述
编译轻松通过(无任何警告,报错)
那现在我们来试试第3种;

很明显,无法通过编译,这时const修饰的是p,p是一个变量,在经过const修饰过后,p中的值无法被改变
最后我们来试试最后一种:
从形式上我们都可以猜的八九不离十了;
在这里插入图片描述
编译很自然的无法通过,因为:*p和p都被const修饰了,那么自然的他们对应的对象的值也就无法更新;

Ⅲ、 const修饰函数

1、const修饰函数参数

void fun(const char* s)
{printf("%s\n",s);
}
int main()
{char a[] = "abcdef";fun(a);return 0;
}

对于那种我们在函数内部不需要进行改变的变量,我们可以加以const修饰,防止我们在后面的编写的时候,不小心,修改了它,导致处bug;

2、const 修饰函数返回值

在这里插入图片描述

Ⅳ、const修饰的变量与常量的区别

尽管被const修饰的变量具有了只读性(常属性),但是从根上来说他还是个变量,它依旧不能用来定义数组,它的存放区域还是在栈区,只是这个区域被加上了只读这个属性;对于常量来说肯定是只读的,因为常量并没有被存放在栈区,它被编译器放在了只读区域,从根上就断绝了它想变为一个变量的念想;

总结

1、const修饰变量呢主要是告诉程序员和编译器,我不希望这个变量被修改
2、可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
3、便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。

三、volatile?

说起这个关键字呢,可能大多数小伙伴都没见过,甚至是大多数程序员也或许未使用过它,因为在目前阶段我们所学的知识不足以支撑我们去使用这个关键字;接下来呢,我就与大家浅谈一下volatile这个关键字;
volatile的中文翻译呢是易变的,不稳定的;volatile关键字和const一样是-种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统硬件或者其他线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

int pass = 1;
int main()
{while (pass){//大家觉得这段代码编译器会做那方面的优化;}return 0;
}

分析:从这段代码我们可以看出,这必定是个死循环;
pass也没有更新的条件,因此为了提高运行效率,编译器会自动帮我们做一个小小优化,本来我们读取pass的值是从内存中读取的,但是由于pass没有更新的条件,又为了提高效率,编译器会帮我们把在内存中的pass的值放在寄存器中去,以后每次我们都是从寄存器中读取pass的值,大大提高了我们的效率;
示意图:
在这里插入图片描述
对于单线程来说的确实一直是死循环,加不加volatile都是一个结果;
但是,对于多线程来说,pass的值有可能会被改变,pass的值也会被重新写回内存,那么这个死循环也有终止的时候;因此这时候,编译器的优化似乎就有点多此一具了;那么这时候我们就需要volatile来帮助我们终止掉这个优化;

加入volatile:

volatile int pass = 1;
int main()
{while (pass){//大家觉得这段代码编译器会做那方面的优化;}return 0;
}

cpu每次就会从内存读取数据,在逐层送到cpu;这也就保证了我们能稳定的访问内存;减少了bug出现的机率;我们的死循环也有了终止的机会;
示意图:
在这里插入图片描述

简单点理解就是:volatile这个关键字,就是希望编译器不要做优化,达到稳定访问内存的目的;
其他问题:

const volatile int a = 10;//这段代码在VS2019x下能编过

是不是觉得很奇怪?
const似乎有点不变的意思;
volatile似乎又有点异变的意思;
是不是感觉有点冲突,
其实呢,我们分开理解就行了const修饰嘛,那么这个变量就具有只读性,不能被直接写入;而volatile就是要求你每次读取都从内存开始;
所以这二者并不冲突;

总结

volatile虽然有易变的意思并不是要求变量一定要改变,而是说变量可能会发生改变,要求编译器放弃优化;
在这里插入图片描述

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

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

相关文章

如何通过twitter群推王引流到listing

粉丝经济绝对是亚马逊卖家营销的最佳方式之一。这时卖家要想&#xff0c;我所选产品的目标客户是谁&#xff0c;他们需要什么&#xff1f;这样才能正确分享自己的资源&#xff0c;让粉丝觉得关注你的账号不是浪费时间和精力&#xff0c;而是真正对我有用。 保持在推特上发微博也…

面试直通卡大放送,微软面试官带你揭秘面试潜规则!

最近&#xff0c;很多朋友吐槽工作压力&#xff0c;高薪工作难找&#xff0c;今年中小企业的就业压力比任何一年都大。 7月16日&#xff0c;国家统计局新闻发言人刘爱华在国新办发布会上坦言&#xff0c;2020年上半年城镇新增就业少173万人。 此外&#xff0c;毕业季大学生失业…

网易互联网产品运营管培生面试经历--从群面到终面面试经验分享

一、网申、在线测评 网易刚刚开始2016校招的时候我就去网申了&#xff0c;快9月中旬的时候改了一次志愿顺序。10月8日收到了网易的短信通知&#xff0c;说通过了简历筛选环节&#xff0c;邀请我参加在线测评。 在线测评是一个CBE&#xff08;如果没记错的话&#xff09;的…

独家揭秘:站外引流的十大技巧!

在今天的互联网时代&#xff0c;如何有效地引流已成为网站运营者面临的一个重要问题。 站外引流是指通过在其他网站或平台上建立链接或发布内容&#xff0c;将流量引导到自己的网站&#xff0c;提高自己网站的访问量。 本文将为大家揭秘站外引流的十大技巧&#xff0c;帮助大…

如何高效快速的做私域引流,巨准实操攻略送给你

如今流量越来越贵&#xff0c;获客成本越来越高&#xff0c;现在商家越来越注重私域的精耕&#xff0c;想尽各种办法&#xff0c;把目标客户锁定在自己的微信私域里。 很多人问&#xff1a;那怎样做私域引流&#xff1f;公域为基地扩充私域流量的抓手当今&#xff0c;公、私域…

私域运营4个基本功介绍(引流,内容,工具,方法论)

私域之所以被重视的根本原因是流量模式的改变。品牌也看到了用户的CLV价值&#xff0c;才愿意投入时间和精力去打造属于自己的私域流量“池”。而品牌在搭建属于自己的私域流量“池”时&#xff0c;应该考虑到在私域的“人”。本篇内容作者将为大家说透品牌私域落地的4大基本功…

HTTPS(面试高频必须掌握)

目录 一、HTTPS背景 二、HTTPS 的工作过程 1. 对称加密 2.非对称加密 3. HTTPS 基本工作过程 3.1 使用对称密钥 3.2 引入非对称密钥&#xff08;面试高频问题&#xff09; 3.3 黑客的手段 3.4 引入证书 3.5 捋一捋 3.6 SSL/TLS 三、HTTP 与 HTTPS 区别&#xff08;…

一对一语音视频直播双端原生+php后台源码 社交交友APP匹配语音视频聊天即时通信源码

介绍&#xff1a; 这套是没有教程的哈&#xff0c;你们需要的自己研究。 开发语言 后端web&#xff1a;PHP Android&#xff1a;Java iOS&#xff1a;obje-ct-ctive-C 全新原生一对一社交软件 速度匹配 视频匹配语音匹配 即时通信产品 秒匹配 秒接通 独立资料卡页面 画面以及语…

chatgpt赋能python:Python代码的修改

Python代码的修改 Python是一门广泛应用于Web开发、数据分析、人工智能等领域的编程语言。当你编写Python代码时&#xff0c;你可能需要修改代码以满足不同的需求。但是&#xff0c;如何修改Python代码并确保其正常运行呢&#xff1f;在本文中&#xff0c;我们将介绍一些关于P…

chatgpt赋能python:Python修改List的教程

Python修改List的教程 当涉及到Python编程时&#xff0c;对于处理和管理数据&#xff0c;List是一个非常常见和有用的数据结构。像大多数数据结构一样&#xff0c;有时需要对List进行修改&#xff0c;以便更好地满足程序的需求。因此&#xff0c;本文将向您展示如何使用Python…

来自MIT的论文答辩、PPT教程,教你轻松应对毕业季和学术会议

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 马上就要毕业了&#xff0c;你是不是还在为论文答辩发愁&#xff1f; 又或者你第一次参加学术会议&#xff0c;不知道如何制作论文海报和演讲PPT&#xff1f; 这些与论文主体看似无关的“细枝末节”&#xff0c;往往没有人帮忙&a…

【学术技巧】论文答辩,老师会仔细看论文内容吗?

有同学问&#xff0c;我要参加学位论文答辩&#xff0c;老师会仔细看论文内容吗&#xff1f; 看看大家怎么回答&#xff1f; 高赞回答一 作者&#xff1a;静寂谷链接&#xff1a;https://www.zhihu.com/question/321307733/answer/673243143来源&#xff1a;知乎 一堆人在写答…

chatgpt赋能python:用Python做量化分析:如何利用编程语言赚取利润

用Python做量化分析&#xff1a;如何利用编程语言赚取利润 在金融市场中&#xff0c;量化分析是一种广泛应用的投资策略。该策略基于数学和统计学模型&#xff0c;利用计算机算法来分析和预测金融市场&#xff0c;以获得更好的投资回报。使用python编程语言可以轻松地进行量化…

ChatGPT最大竞争对手来了,两分钟保姆级教程

这个教程前几天就要出了&#xff0c;一直排到今天。 我们都知道&#xff0c;因为ChatGPT在国内的各种限制&#xff0c;非常影响我们体验。 但是现在我们有了更多选择&#xff0c;ChatGPT最大的竞争对手横空出世 Claude的技术部分就来自于OpenAI&#xff0c;AIria测试下来Cla…

苹果IOS使用教程如何使用PPTP达到给手机换IP

IOS系统下使用PPTP教程&#xff0c;默认IOS10及以上系统不再支持PPTP&#xff0c;以IOS8系统为教程&#xff0c;仅供参考 第一步&#xff1a;打开设置 第二步&#xff1a;找到通用按键 第三步&#xff1a;找到这个协议 第四步&#xff1a;添加设备 第五步&#xff1a;根据商家提…

苹果IOS手机端该如何连接PPTP?

PPTP是一种协议&#xff0c;用以修改手机端和电脑端上的协议&#xff0c;且不需要安装额外的软件&#xff0c;就能屏蔽掉本地IP。 它为单地区和混拨。单地区就是指单个地区的IP&#xff0c;混拨指多个地区的IP。 不同的手机打开方式有点不一样&#xff0c;具体以手机为准&…

八丶傻妞新版教程+对接微信对接公众号对接TG(飞机)教程

没有服务器的先自行购买&#xff0c;这里推荐腾讯云2H4G8M首年70–点击购买 QQ交流&#xff1a;1014549449 --------------点击跳转 傻妞安装 老用户先执行 &#xff0c;菜鸟直接删除原有的傻妞 delete silly compiled_at一键安装命令 aarm64;if [[ $(uname -a | grep &qu…

Android开发——项目实例(三)迷你背单词软件(第三版)单词录入、背诵、联网查词、单词库

软件效果图 源码地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1NivmPpx6ZUDEmSMtWzVziQ 提取码&#xff1a;8pin

(新东方)背单词,记住这200个词根词缀就够了(我自用)

“无意中发现了一个巨牛的人工智能教程&#xff0c;忍不住分享一下给大家。教程不仅是零基础&#xff0c;通俗易懂&#xff0c;而且非常风趣幽默&#xff0c;像看小说一样&#xff01;觉得太牛了&#xff0c;所以分享给大家。点这里可以跳转到教程。”。 帮助记忆前缀: a.b.c.…