C语言中易肴杂概念的关键字

[复制链接]
发表于 2026-1-18 17:24:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
最快的关键字---- register register:

这个关键字哀求编译器尽大概的将变量存在 CPU 内部寄存器中而不是通过内 存寻址访问以进步服从。注意是尽大概,不是绝对。你想想,一个 CPU 的寄存器也就那么 几个或几十个,你要是界说了许多许多 register 变量,它累死也大概不能全部把这些变量放 入寄存器吧,轮也大概轮不到你。

CPU明确为天子,寄存器可以明确为中转站(小宦官),内存明确为大臣。从内存中那数据先放到寄存器,然后 CPU 再从寄存器里读取数据来处置惩罚,处置惩罚 完后同样把数据通过寄存器存放到内存里,CPU 不直接和内存打交道。

注意:小宦官是自动的从大臣手里接过奏章,然后自动的交给天子同道,但寄存器没这么自发, 它从不自动干什么事。一个天子大概有好些小宦官,那么一个 CPU 也可以有许多寄存器, 差异型号的 CPU 拥有寄存器的数目不一样。
为啥要这么贫苦啊?速率!就是由于速率。寄存器着实就是一块一块小的存储空间,只 不外其存取速率要比内存快得多。进水楼台先得月嘛,它离 CPU 很近,CPU 一伸手就拿到 数据了,比在那么大的一块内存里去探求某个所在上的数据是不是快多了? 
使用register修饰符的注意点 

使用 register 修饰符也有些限定的:register 变量必须是 能被 CPU 寄存器所担当的范例。意味着 register 变量必须是一个单个的值,而且其长度应小 于或即是整型的长度。 而且 register 变量大概不存放在内存中,以是不能用取址运算符“&” 来获取 register 变量的所在。

最名不符实的关键字----static

不要误以为关键字 static 很安静,着实它一点也不安静。这个关键字在 C 语言里告急有 两个作用,C++对它举行了扩展。

修饰变量 第一个作用:修饰变量。

变量又分为局部和全局变量,但它们都存在内存的静态区。
静态全局变量,作用域仅限于变量被界说的文件中,其他文件即使用 extern 声明也没法 使用他。精确地说作用域是从界说之处开始,到文件末了处竣事,在界说之处前面的那些 代码行也不能使用它。想要使用就得在前面再加 extern ***。想要使用方便, 直接在文件顶端界说不就得了。
静态局部变量,在函数体内里界说的,就只能在这个函数里用了,同一个文档中的其他 函数也用不了。由于被 static 修饰的变量总是存在内存的静态区,以是纵然这个函数运行竣事,这个静态变量的值照旧不会被烧毁,函数下次使用时仍旧能用到这个值。 
  1. static int j;
  2. void fun1(void)
  3. {
  4.   static int i = 0;
  5.   i++;
  6.   printf("%d ", i);
  7. }
  8. void fun2(void)
  9. {
  10. j = 0;
  11. j++;
  12. printf("%d ", j);
  13. }
  14. int main()
  15. {
  16.         for (int k = 0; k < 10; k++)
  17.         {
  18.                 fun1();       
  19.         }
  20.         printf("\n");
  21.         for (int k = 0; k < 10; k++)
  22.         {
  23.                 fun2();
  24.         }
  25.         return 0;
  26. }
复制代码


修饰函数 第二个作用:修饰函数。

函数前加 static 使得函数成为静态函数。但此处“static”的寄义不是指存储方式,而是指对函数的作用域仅范围于本文件(以是又称内部函数)。使用内部函 数的优点是:差异的人编写差异的函数时,不消担心本身界说的函数,是否会与别的文件 中的函数同名。 关键字 static 有着不平常的汗青。早先,在 C 中引入关键字 static 是为了表现退出一个块后仍旧存在的局部变量。随后,static 在 C 中有了第二种寄义:用来表现不能被别的文件访问的全局变量和函数。为了制止引入新的关键字,以是仍使用 static 关键字来表现这第二种寄义。 
 最冤枉的关键字----sizeof

常年被人误以为函数 sizeof 是关键字不是函数,着实就算不知道它是否为 32 个关键字之一时,我们也可以 借助编译器确定它的身份。
看下面的例子: int i=0; A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i; 毫无疑问,32 位体系下 A),B)的值为 4。那 C)的呢?D)的呢?
在 32 位体系下,通过 Visual C++6.0 或恣意一编译器调试,我们发现 D)的结果也为 4。 咦?sizeof 反面的括号呢?没有括号居然也行,那想想,函数名反面没有括号行吗?
由此轻 易得出 sizeof 绝非函数。 好,再看 C)。编译器怎么怎么提示堕落呢?不是说 sizeof 是个关键字,其反面的括号 可以没有么?那你想想 sizeof int 表现什么啊?int 前面加一个关键字?范例扩展?显着不精确,我们可以在 int 前加 unsigned,const 等关键字但不能加 sizeof。
好,记着:sizeof 在 盘算变量所占空间巨细时,括号可以省略,而盘算范例(模子)巨细时不能省略。一样平常环境下, 乖乖的写上括号,继续装作一个“函数”,做一个“披着函数皮的关键字”。 说到底它是关键字关键字关键字

 栗子:
p是指针范例,指向的对象是char范例,32位体系下盘算p的巨细为4,*p的巨细为1
 


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表