变量的存储类别1月27日学习笔记

一、作用域

作用域是一个变量在程序中可被访问的范围或上下文。

局部变量 --- 一定在某一个{} 范围内
全局变量 --- 不在任何一个{} 范围内

可见性:
    程序运行到某个点,哪些标识符可见 

标识符的可见性的规则:
1.先定义,后使用 
2.同一作用域中,不能有同名标识符
3.在不同的作用域,同名标识符,相互之间没有影响 .

4.内层作用域的同名标识符,会屏蔽外层的作用域的同名标识符。

变量的存储类别1月27日学习笔记_第1张图片变量的存储类别1月27日学习笔记_第2张图片

再定义一个同名的全局变量

变量的存储类别1月27日学习笔记_第3张图片

变量的存储类别1月27日学习笔记_第4张图片

此时会打印函数里的a,也就是屏蔽了外层的作用域。
 

二、静态变量与动态变量

  1. 静态变量(Static Variables)

  2. 静态变量在程序执行期间一直存在,不会因为函数的调用而被销毁。它的生命周期是整个程序运行期间。静态变量可以分为两种类型:

  • 函数内部的静态变量(Static Local Variables):在函数内部定义的静态变量在函数执行时进行初始化,并且在函数调用结束后不会被销毁,下次函数调用时,该变量的值保留上一次调用的值。
  •  全局变量(静态变量) --- 此时,
          
        1.不能用变量进行初始化,只能常量初始化 
                                
        2.把变量放到了内存中的静态区
          只会被初始化一次 

        3.值具有

  • 继承性       

#include 

void foo() {
    static int count = 0;
    count++;
    printf("Count: %d\n", count);
}

int main() {
    foo();  // 输出 Count: 1
    foo();  // 输出 Count: 2
    foo();  // 输出 Count: 3
    
    return 0;
}

 件作用域的静态变量(Static Global Variables):在函数外部定义的静态变量只能在当前文件中访问。它们的作用域是整个文件,且只能被当前文件中的函数所访问。

// file1.c
#include 

static int count = 0;

void foo() {
    count++;
    printf("Count in foo: %d\n", count);
}

// file2.c
#include 

extern void foo();

int main() {
    foo();  // 输出 Count in foo: 1
    foo();  // 输出 Count in foo: 2
    foo();  // 输出 Count in foo: 3
    
    return 0;
}

动态变量(Dynamic Variables):

动态变量(局部变量-空间是开辟在栈上的--自动申请自动释放) (声明周期):
从定义的语句开始,到所在的作用域范围结束 。

三、变量的4大存储类别

1.auto

auto是默认的存储类别,如果没有显式指定存储类别,变量会被默认定义为auto。auto存储类适用于局部变量,它在函数的作用域内声明,当函数执行完后自动销毁。

我们普通定义的那些函数里的 变量就是auto型 只是把auto省略掉了。

2.static

static 关键字来定义静态存储类变量或函数

static 关键字用于改变变量的存储位置和作用域。具体来说,使用 static 定义的变量存储在静态存储区中,具有静态持续性,即使函数返回,它的值也会保留。而且,static 变量只能在当前文件中访问,不能被其他文件访问。(这点在以后大项目中经常用到)

static 变量的生存周期是整个程序的运行期间,而不是仅在函数调用期间。 

 static 修饰局部变量
        //将局部变量 存储在了 全局区(静态区)
        //将局部变量的生命周期延长 
  static 修饰全局变量
       //表示 将全局变量 的作用域限定到本文件中 
       //别的文件中不能extern了     
  extern 可以放在函数声明中  --函数声明 
       //表示的意思 --将函数作用域扩展到当前文件
  static 加在函数前面 
       //  此时效果与修饰全局变量效果一样 
       // 将函数作用域限定到本文件中

3.extern

extern存储类用于引用已经在其他文件中定义的全局变量。extern关键字告诉编译器该变量在当前文件中是外部可见的,实际的变量定义可能在其他文件中。 

extern int x;  // 引用其他文件中定义的x变量

 extern int a;  //扩展 延伸 
                 //表示 此时这个a 不是在当前文件中定义的 ,
                 //如果要用,请到别的文件中寻找
                 //多文件编程 
                 //一般使用在多文件编程中:
                 //如果想在当前文件使用别的文件中的 全局变量 ,
                 //此时,可以使用
                 //extern int a; //做声明 
                 //相当于,把别的文件中的变量作用域扩展到当前文件
 

4.register

 register int x;

建议将x 存储在cpu寄存器中,

这样会使不能 &取地址  x。

你可能感兴趣的:(学习,笔记)