C语言学习第四天 四种存储类

什么是存储类?

  • 存储类定义 C 程序中变量/函数的范围(可见性)和生命周期

存储类的类型有哪些 ?

  • 存储类的类型有四种,分别是:auto,static,register,extern.
auto (自动)存储类

auto 存储类是所有局部变量默认的存储类。存放到栈空间中,当函数执行完毕,栈空间就会被系统自动释放。
示例 :

#include <stdio.h>
int main() {
	//auto
    {
        int mount;
        //其实在函数中的局部变量,不加特殊声明,都是auto变量
        // 但是关键字"auto"可以被省略。
        // 这些变量在函数被调用时分配存储方式
        // 函数调用结束后这些存储空间就被释放了。
        auto int month;
    }
	
	{
   register int  miles;
	}
    return 0;
}
static (静态) 存储类
  • (1)static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
  • (2)static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
  • (3)全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。
//
// Created by dell on 2019.12.30.
//

#include <stdio.h>

//声明一个 fun1 方法
void fun1(void);

//定义一个全局变量
static int count = 10;

int main() {
    {
        //定义的整形变量a的存储方式是静态存储的,静态局部变量是放在静态存储区内分配存储单元的,在整个程序运行期间都不释放,跟全局变量一样长期占用内存。
        // 但是静态变量和全局变量还是不一样的,比如说,静态变量只能在所定义的函数内引用,静态局部变量在函数调用结束后是仍然存在的,但不能被其他函数引用。
        //静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已经有了初值
        // 以后每次调用函数时不再对其重新复制,而只是保留上次函数调用结束时的值。
        // 在定义静态局部变量时,如不赋初值,则编译时自动赋初值为0。
        //有时在程序设计中定义一个全局变量,只限于被所在源文件引用,而不想让其他文件引用,则可在定义全局变量前面加static。

        {
            //调用方法 10 次
            while (count--) {
                fun1();
            }
        }
    }
}

//定义 fun1 方法
void fun1() {
    //只初始化一次 再次 调用不会值不会覆盖
    static int a = 5;
    a++;
    printf("a = %d,count =  %d\n", a, count);
}

register (寄存器) 存储类

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。
这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。
当没有申请到寄存器来存储此变量时,该变量则自动转为auto类型!
声明为寄存器存储类型的变量,不能够取地址!

//
// Created by dell on 2019.12.16.
//

#include <stdio.h>

int main() {
    {
        int mount = 20 ;
        //其实在函数中的局部变量,不加特殊声明,都是auto变量
        // 但是关键字"auto"可以被省略。
        // 这些变量在函数被调用时分配存储方式
        // 函数调用结束后这些存储空间就被释放了。
        auto int month;
        month = 10;
        printf("%d", month+mount); //30
    }


    {
        int aaa = 1;
        //赋初始值是在定义时进行,外部变量声明不能赋初始值
        //对于一些频繁使用的变量,程序在执行的过程中,每次用到这些变量的时候,都要从内存取出来,运算完了之后还要写到内存中去
        // 循环执行的次数越多,花费的时间就越多,
        // 为提高效率,C++允许将局部变量放在CPU的寄存器上,需要用到时直接从寄存器上取出参加运算,就不用再到内存中取;
        register int i,sum=0;
        for(i=0;i<10000;i++){
            sum+=i;
        }
        printf("%d", sum);
    }
    return 0;
}

extern (外部)存储类

  • extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
  • 当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
#clion 中 把两个文件放一起编译的办法是 在 CMakeLists.txt 文件中配置如下,否则是无法执行的
add_executable(demo07  test07.c  test08.c)
//两个类中的方法要放在一起编译
//test 07 中代码
//
// Created by dell on 2019.12.30.
//

#include <stdio.h>

//声明一个 count 变量
int count ;
//声明外部 方法 assignment
extern void assignment();
int main()
{
    //给count 赋值
    count = 5;
    //调用方法
    assignment();
}

//test08中代码
// Created by dell on 2019.12.30.
//

#include <stdio.h>

//获取外部的count
extern int count;
//定义方法assignment
void assignment(void)
{
    //方法中直接输出 count
    printf("count = %d\n", count);
}
发布了88 篇原创文章 · 获赞 114 · 访问量 3016

猜你喜欢

转载自blog.csdn.net/hongchenshijie/article/details/103569174