个性化阅读
专注于IT技术分析

C语言中的存储类用法详细指南

存储类用于描述变量/函数的功能。这些功能基本上包括范围, 可见性和生存时间, 它们可以帮助我们在程序运行时跟踪特定变量的存在。

C语言使用4个存储类, 即:

C中的存储类1

auto:这是在函数或块内声明的所有变量的默认存储类。因此, 用C语言编写程序时很少使用关键字auto。自动变量只能在已声明的块/功能内访问, 而不能在其外部(定义其范围)访问。当然, 可以在声明了auto变量的父块/函数中的嵌套块内访问它们。但是, 也可以使用此处给出的指针概念, 通过指向变量所驻留的非常精确的内存位置来访问它们。在声明它们时, 默认情况下会为它们分配一个垃圾值。

extern:外部存储类仅告诉我们该变量是在其他位置定义的, 而不是在使用该变量的同一块中定义的。基本上, 该值是在另一个块中分配给它的, 也可以在另一个块中对其进行覆盖/更改。因此, extern变量不过是一个全局变量, 该全局变量使用在声明该变量的合法值进行初始化, 以便在其他地方使用。可以在任何功能/块中访问它。同样, 也可以通过将” extern”关键字放在任何功能/块的声明/定义之前, 将普通全局变量设为外部。这基本上表示我们不是在初始化新变量, 而是仅在使用/访问全局变量。使用外部变量的主要目的是可以在属于大型程序的两个不同文件之间访问它们。有关外部变量如何工作的更多信息, 请查看此链接。

static:此存储类用于声明静态变量, 这些静态变量在用C语言编写程序时经常使用。静态变量具有即使超出范围也能保留其值的属性!因此, 静态变量在其范围内保留了其最后一次使用的值。因此, 可以说它们仅被初始化一次, 并且一直存在到程序终止为止。因此, 没有分配新的内存, 因为它们没有被重新声明。它们的范围对于定义它们的功能是局部的。全局静态变量可以在程序中的任何位置访问。默认情况下, 编译器将它们分配为值0。

register:此存储类声明寄存器变量, 这些变量具有与auto变量相同的功能。唯一的区别是, 如果有可用寄存器, 则编译器将尝试将这些变量存储在微处理器的寄存器中。这使得寄存器变量的使用比程序运行期间存储在存储器中的变量的使用要快得多。如果没有可用的寄存器, 则将它们仅存储在存储器中。通常, 使用register关键字声明很少在程序中经常访问的变量, 这可以缩短程序的运行时间。这里要注意的重要和有趣的一点是, 我们无法使用指针获取寄存器变量的地址。

要指定变量的存储类, 应遵循以下语法:

语法如下:

storage_class var_data_type var_name;

函数遵循与上述变量相同的语法。请看以下C示例以进一步说明:

// A C program to demonstrate different storage
// classes
#include <stdio.h>
  
// declaring the variable which is to be made extern
// an intial value can also be initialized to x
int x;
  
void autoStorageClass()
{
  
     printf ( "\nDemonstrating auto class\n\n" );
  
     // declaring an auto variable (simply
     // writing "int a=32;" works as well)
     auto int a = 32;
  
     // printing the auto variable 'a'
     printf ( "Value of the variable 'a'"
            " declared as auto: %d\n" , a);
  
     printf ( "--------------------------------" );
}
  
void registerStorageClass()
{
  
     printf ( "\nDemonstrating register class\n\n" );
  
     // declaring a register variable
     register char b = 'G' ;
  
     // printing the register variable 'b'
     printf ( "Value of the variable 'b'"
            " declared as register: %d\n" , b);
  
     printf ( "--------------------------------" );
}
  
void externStorageClass()
{
  
     printf ( "\nDemonstrating extern class\n\n" );
  
     // telling the compiler that the variable
     // z is an extern variable and has been
     // defined elsewhere (above the main
     // function)
     extern int x;
  
     // printing the extern variables 'x'
     printf ( "Value of the variable 'x'"
            " declared as extern: %d\n" , x);
  
     // value of extern variable x modified
     x = 2;
  
     // printing the modified values of
     // extern variables 'x'
     printf ( "Modified value of the variable 'x'"
            " declared as extern: %d\n" , x);
  
     printf ( "--------------------------------" );
}
  
void staticStorageClass()
{
     int i = 0;
  
     printf ( "\nDemonstrating static class\n\n" );
  
     // using a static variable 'y'
     printf ( "Declaring 'y' as static inside the loop.\n"
            "But this declaration will occur only"
            " once as 'y' is static.\n"
            "If not, then every time the value of 'y' "
            "will be the declared value 5"
            " as in the case of variable 'p'\n" );
  
     printf ( "\nLoop started:\n" );
  
     for (i = 1; i < 5; i++) {
  
         // Declaring the static variable 'y'
         static int y = 5;
  
         // Declare a non-static variable 'p'
         int p = 10;
  
         // Incrementing the value of y and p by 1
         y++;
         p++;
  
         // printing value of y at each iteration
         printf ( "\nThe value of 'y', "
                "declared as static, in %d "
                "iteration is %d\n" , i, y);
  
         // printing value of p at each iteration
         printf ( "The value of non-static variable 'p', "
                "in %d iteration is %d\n" , i, p);
     }
  
     printf ( "\nLoop ended:\n" );
  
     printf ( "--------------------------------" );
}
  
int main()
{
  
     printf ( "A program to demonstrate"
            " Storage Classes in C\n\n" );
  
     // To demonstrate auto Storage Class
     autoStorageClass();
  
     // To demonstrate register Storage Class
     registerStorageClass();
  
     // To demonstrate extern Storage Class
     externStorageClass();
  
     // To demonstrate static Storage Class
     staticStorageClass();
  
     // exiting
     printf ( "\n\nStorage Classes demonstrated" );
  
     return 0;
}
  
// This code is improved by RishabhPrabhu

输出如下:

演示C语言中存储类的程序
演示auto类
声明为auto的变量” a”的值:32
——————————–
演示寄存器类
声明为寄存器的变量” b”的值:71-
————————————
演示extern类
声明为extern的变量” x”的值:0
声明为extern的变量” x”的修改后的值:2
——————————
静态类在循环内将” y”声明为静态。
但是此声明仅会发生一次, 因为” y”是静态的。
如果不是, 则每次’y’的值都是声明的值5, 如在变量’p’的情况下循环启动:’y’的值, 声明为静态的, 在1次迭代中为6。
non的值-static变量’p’, 在1次迭代中为11’y’的值, 声明为静态, 在2次迭代中为7非静态变量’p’的值, 在2次迭代中为11, ‘y’的值, 声明为静态,
在3次迭代中为8非静态变量’p’的值, 在3次迭代中为11值’y’的值, 在4次迭代中声明为静态, 为9次,
非静态变量’ p’, 在4次迭代中是11循环结束:
——————————–
展示了存储类

赞(0) 打赏
未经允许不得转载:srcmini » C语言中的存储类用法详细指南
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏