C 程序中可用的4个存储类
单片机与嵌入式 2024-06-14

C语言存储类

存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C 程序中可用的存储类:

  • auto

  • register

  • static

  • extern

auto 存储类

auto 存储类是所有局部变量默认的存储类。

{
   int mount;
   auto int month;
}

上面的实例定义了两个带有相同存储类的变量,auto 只能用在函数内,即 auto 只能修饰局部变量。

register 存储类

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。

{
   register int miles;
}

寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 'register' 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。

static 存储类

static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。

static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。static 是全局变量的默认存储类,以下两个变量 (count 和 road) 都有一个 static 存储类。

static int Count;int Road;main()
{
    printf("%d\n", Count);
    printf("%d\n", Road);
}

以下实例演示了 static 修饰全局变量和局部变量的应用:

#include 

/* 函数声明 */

voidfunc1(void);

staticintcount=10;

/* 全局变量 - static 是默认的 */

intmain()

{

while(count--)

{

func1();

}

return0;

}

voidfunc1(void)

{

/* 'thingy' 是 'func1' 的局部变量 - 只初始化一次*/

/* 每次调用函数 'func1' 'thingy' 值不会被重置。 */

staticintthingy=5;

thingy++;

printf(" thingy 为 %d , count 为 %d\n", thingy, count);

}

实例中 count 作为全局变量可以在函数内使用,thingy 使用 static 修饰后,不会再每次调用时重置。可能您现在还无法理解这个实例,因为已经使用了函数和全局变量,这两个概念目前为止还没进行讲解。即使您现在不能完全理解,也没有关系,后续的文章我们会详细讲解。当上面的代码被编译和执行时,它会产生下列结果:

 thingy 为 6 , count 为 9
 thingy 为 7 , count 为 8
 thingy 为 8 , count 为 7
 thingy 为 9 , count 为 6
 thingy 为 10 , count 为 5
 thingy 为 11 , count 为 4
 thingy 为 12 , count 为 3
 thingy 为 13 , count 为 2
 thingy 为 14 , count 为 1
 thingy 为 15 , count 为 0

extern 存储类

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。

extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,如下所示:

第一个文件:main.c实例

1
2
3

4

5

6

#include 
int count ;extern void write_extern();

main()

{

count = 5;   write_extern();

}

第二个文件:support.c实例

1
2
3

4

5

6

#include 
extern int count;

void write_extern(void)

{

printf("count is %d\n", count);

}

在这里,第二个文件中的 extern 关键字用于声明已经在第一个文件 main.c 中定义的 count。现在 ,编译这两个文件,如下所示:

$ gcc main.c support.c

这会产生 a.out 可执行程序,当程序被执行时,它会产生下列结果:

count is 5


声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • C语言
  • 编程
  • 软件开发
  • 程序
  • python计算平均数的IPO模式

    求平均值的方法:首先新建一个python文件;然后初始化sum总和的值;接着循环输入要计算平均数的数,并计算总和sum的值;最后利用“总和/数量”的公式计算出平均数即可。65a220812a55465d245f518b81fb68d2.png本文操作...

    前天
  • 怎么理解RPC远程过程调用?

    一.什么是RPC?RPC(remote process call),中文是远程过程调用的意思。怎么理解这个远程过程调用呢?可以这样理解,可以与本地的过程调用对比下,本地过程调用,也就是调用函数或者是调用方法,比如说,在单体架...

    前天
  • 磁带驱动器备份数据的5个常见问题解决方案

    磁带驱动器是一种用于读写磁带的工具。磁带驱动器(tape drive)是存储计算机中的数据到磁带上的设备,其主要目的是数据备份和归档。磁带驱动器,注意当你的时候意味着要更换磁盘驱动器里的磁盘而且要备份一整夜?我们...

    前天
  • 局域网是如何连接形成更大范围的信息处理系统的?

    本地电话网是在一个封闭编号区内,由端局(或端局、汇接局)、局间中继线、长市中继线以及端局的用户线、电话机、用户交换机所组成的自动电话网。 每个本地电话网均为自动电话交换网,有一个单独的长途区号,一个长...

    前天
  • 如何使用数字滤波器进行信号处理

    数字滤波器是由数字乘法器、加法器和延时单元组成的一种算法或装置。数字滤波器的功能是对输入离散信号的数字代码进行运算处理,以达到改变信号频谱的目的。 如果采用通用的计算机,随时编写程序就能进行信号处理...

    前天
  • 宽带智能网多媒体业务运营成本降低策略

    宽带智能网,是研究在以atm为基础的宽带网络上利用智能网技术如何开发各种多媒体业务。宽带智能网不是简单地将多种业务集成,它的目的是要实现一个可编程的业务平台,实现业务的灵活加载、扩展和新业务的增加。与以...

    前天
  • DSL技术如何解决“最后一公里”传输瓶颈问题?

    所谓领域专用语言(domain specific language / DSL),其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖一切软件问题,而是专门针对某一特定问题的计算机语言。DSL之于程序员正如伽南地之于以色列人,是...

    前天
  • 基于muduo高性能网络库+Protobuf开发

    前言介绍基于c++的分布式网络框架,项目基于muduo高性能网络库+Protobuf开发,实现的主要功能是通过

    07-12
  • spdlog 的高效性5个方面

    线程池线程池本质上一组事先创建的子线程,用于并发完成特定任务的机制,避免运行过程中频繁创建、销毁线程,从而降低

    07-12
  • Linux环境下Libevent 的工作流程

    一.Libevent简介I/O 框架库以库函数的形式,封装了较为底层的系统调用,给应用程序提供了一组更便于使用

    07-12
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告