首页 > 其他分享 >C语言的存储类别

C语言的存储类别

时间:2023-04-29 21:45:54浏览次数:38  
标签:存储 变量 作用域 C语言 int 类别 链接 函数

存储类别

概念

  • 对象:硬件中,被存储的每个值都占用一定的物理内存,c语言吧这样的一块内存成为对象
  • 标识符:标识符用来指定特定的对象
  • 存储期:用来描述对象,描述对象在内存中保留了多长时间
  • 作用域、用来描述标识符,描述程序中可以访问标识符的区域
  • 链接:用来描述标识符,c语言有3中链接属性:外部链接、内部链接、无连接
  1. 作用域

    c拥有四种作用域:块作用域、函数作用域、函数原型作用域、文件作用域

    • 块作用域

      块是一对花括号括起来的代码区域,如,整个函数体、任意复合语句

      定义在块中的变量具有块作用域

      可见范围:从定义处含该定义块的末尾

    • 函数作用域

      函数作用域仅用于goto语句的标签

    • 函数原型作用域

      用于函数原型中的形参名

      int mighty(int mouse, double large);
      

      可见范围:从形参定义处到原型声明结束

      这意味着,编译器在处理函数原型中的形参时只关心它的类型,形参名无关紧要。即使有形参名,也不必与函数定义中的形参名相匹配

      注意:边长数组中,形参名有用

      void use_a_VLA(int n, int m, ar[n][m]);
      

      方括号中必须使用在函数原型中已声明的名称

    • 文件作用域

      定义在函数外面的变量,具有文件作用域。

      可见范围:定义处文件末尾

  2. 链接

    c拥有3中链接属性:外部链接、内部链接、无连接

    • 无连接

      无连接变量:块作用域变量、函数原型作用域变量、函数作用域变量

      这些变量只属于定义他们的区域

    • 外部链接

      外部链接变量:文件作用域变量

      外部链接作用域变量简称为全局作用域变量可以在多文件程序中使用

    • 内部链接

      内部链接变量:文件作用域变量

      只能在一个翻译单元中使用

      一个翻译单元:一个源代码文件和它所包含的头文件

  3. 存储期
    c有四种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期

    • 静态存储期

      生存期:在程序的执行期间一直存在。

      变量:文件作用域变量具有静态存储期

      注意:static关键字只表明了该变量是内部链接变量,无论是外部链接变量还是内部链接变量,文件作用域变量都具有静态存储期

    • 线程存储期

      生存期:线程存储期用于并发程序设计,从被声明到线程结束一直存在

      变量:以关键字_Thread_local_声明的变量,此类变量在每个线程中都有私有备份

    • 自动存储期

      生存期:从块的开始处到块的结束,边长数据是从变量定义到块结束

      变量:块作用域变量就具有自动存储期

存储类别

存储类别 存储期 作用域 链接 声明方式
自动 自动 块内
寄存器 自动 块内,使用关键字register
静态外部链接 静态 文件 外部 所有函数外
静态内部链接 静态 文件 内部 所有函数外,使用关键字static
静态无链接 静态 块内,使用关键字static
  1. 自动变量

    • 属性:自动存储期、块作用域、无链接

    • 定义:声明在块、函数头中的任意变量都属于自动存储变量

      int main(void)
      {
         auto int plox;
      }
      
    • 关键字auto是自动变量说明符,块内定义的变量默认为auto类型,为了与c++程序兼容,通常省略auto说明符

    • 块作用域和无链接意味着只有在变量定义的块中才能访问该变量

    • 如果内层块的变量名与外层块中的变量同名,内层块会隐藏外层块的定义

    • 自动化变量不会初始化

  2. 寄存器变量

    • 属性:块作用域、无连接、自动存储期

    • 定义:使用说明符register

      int main(void)
      {
          register int quick;
      }
      
    • 编译器会根据情况衡量register变量,有时会忽略register,此时变量会变成普通的寄存器变量

    • 即使register变量变成了普通自动变量,仍然不能对该变量使用地址运算符

  3. 静态无连接

    • 属性:块作用域、无连接、静态存储器

    • 定义:在块中使用static声明的变量

      #include <stdio.h>
      void trystat(void);
      
      int main(void)
      {
          int count;
          
          for (count = 1; count <= 3; count++)
          {
              printf("Here comes iteration %d:\n", count);
              trystat();
          }
          
          return 0;
      }
      
      void trystat(void)
      {
          int fade = 1;
          static int stay = 1;
          printf("fade = %d and stay = %d\n", fade++, stay++);
      }
      
    • 静态变量stay可访问的范围仍然是trystat函数内,但每次调用后的stay变量值会被保存

  4. 外部链接的静态变量

    • 属性:文件作用域、外部链接、静态存储期

    • 定义:定义在所有函数外面的变量,有时称为外部变量

    • 外部变量可在函数中用关键字extern再次声明。

    • 如果一个源代码文件使用的外部变量定义在另一个源代码文件中,则必须使用extern在该文件中声明变量

      int Errupt; /* 外部变量 */
      extern char Coal; /* 定义在另一个文件中的外部变量 */
      
      int main(void)
      {
          extern int Errupt; /* 可选的声明 */
          ...
      }
      
    • 外部变量若未显式的初始化赋值,外部变量会被初始化为0,数组内容亦是如此

  5. 内部链接的静态变量

    • 属性:文件作用域、静态存储期、内部链接

    • 定义:使用static定义在所有函数外部的变量,也称外部静态变量

      static int svil = 1; // 静态变量,内部链接
      int main(void)
      {
          
      }
      
    • 可视范围:同一文件的任意函数

  6. 存储类别和函数

    • 函数拥有两种存储类别:外部函数(默认)、静态函数

      double gamma(double); /* 函数默认为外部函数 */
      static double beta(int, int); /* 静态函数 */
      extern double delta(double, int);/* 外部函数 */
      
    • 在同一程序的其他源文件中,可以调用gamma和delta,但是不能调用beta

    • 使用static的函数具有文件私有性,可避免名称冲突的问题

    • 通常的做法是:用extern关键字声明定义在其他文件中的函数。
      此篇文章为学习C Primer Plus 第六版的笔记

标签:存储,变量,作用域,C语言,int,类别,链接,函数
From: https://www.cnblogs.com/rkaixuan/p/17364521.html

相关文章

  • C语言函数大全-- s 开头的函数(3)
    C语言函数大全本篇介绍C语言函数大全--s开头的函数(3)1.sleep1.1函数说明函数声明函数功能unsignedintsleep(unsignedintseconds);它是C语言标准库中的函数,用于使当前进程挂起一定的时间。在挂起期间,操作系统会将该进程从调度队列中移除,直到指定的时间过去为......
  • c语言创建队列的链式存储
    #include<stdio.h>#include<stdlib.h>typedefstructLinkNode{intdata;structLinkNode*next;}LinkNode;typedefstructLink{LinkNode*front,*rear;//frontrear为链表的伴随指针}LinkQueue;//初始化voidInitQueue(LinkQueue*......
  • c语言报错 [Error] invalid initialization of non-const reference of type 'LinkQue
     进行地址传递是出现报错临时值不能作为非常量引用参数进行传递所以需要在main函数中·重新定义指针传递 ......
  • 4.存储过程
    1、创建一个存储过程,测试课程号为j005是否有成绩。CREATEPROCEDUREcheck_grade_for_j005_1ASBEGINDECLARE@OutputValueVARCHAR(100);IF(SELECT课程号FROM课程表WHERE课程号='j005')='j005'SET@OutputValue='Gradesforcoursej005exist.';ELSESET......
  • 希望所有计算机学生能看到这篇c语言教程
    大部分程序员走入编程世界第一个学习的语言就是C语言。作为一门古老的编程语言,c语言拥有48年的发展历程。为什么要学习C语言?C语言是学习计算机程序设计语言的入门语言。最全面的编程面试网站C语言是一门偏底层的语言,学好它,可以让你更好的了解计算机。学会了C语言,你就能学习......
  • c语言中inline用法
    使用inline函数可以提升程序效率,但是让inline函数生效是有条件的...打开Linux内核源代码,会发现内核在定义C语言函数时,有很多都带有“inline”关键字,请看下图,那么这个关键字有什么作用呢? inline关键字的作用在C语言程序开发中,inline一般用于定义函数,inline函数也被称作......
  • C语言函数大全-- s 开头的函数(2)
    C语言函数大全本篇介绍C语言函数大全--s开头的函数(2)1.setlinestyle1.1函数说明函数声明函数功能voidsetlinestyle(intlinestyle,unsignedupattern,intthickness);设置当前绘图窗口的线条样式、线型模式和线条宽度参数:linestyle:线条样式,取值范围......
  • C语言复习
    环境配置(Windows、Linux、Mac)https://fishc.com.cn/forum.php?mod=forumdisplay&fid=329&filter=typeid&typeid=571java与C语言的对比linux运行代码转义字符define把所有出现的标识符全部转换为常量写法:#define标识符常量例如#defineURL"www.baidu.com"#defineD......
  • EF Core 中原生SQL、存储过程、视图的使用
    包括EFCore中原型Sql的执行,包括存储过程和视图数据处理方法,同时包括参数化执行sql语句的注意事项。原生Sql查询原生sql查询使用如下两个方法进行,查询的结构只能映射到dbset关联的对象类型DBSet.FromSqlRaw()DBSet.FromSqlInterpolated()可以使用部分linq扩展方法.FromSqlR......
  • C语言刷leetcode——并查集
    目录概述参考链接:刷题入门题:547.省份数量(朋友圈)684.冗余连接概述https://leetcode.cn/problems/number-of-provinces/solution/python-duo-tu-xiang-jie-bing-cha-ji-by-m-vjdr/基本概念并查集是一种数据结构并查集这三个字,一个字代表一个意思。并(Union),代表合并查(Find),......