目录

变量的属性:数据类型、储存类型

数据类型:

储存类型:

 自动变量(auto):

 外部变量(extern):

 静态变量(static):

寄存器变量(register):

变量的属性:数据类型、储存类型

数据类型:

基本类型 : char,int,long,float,double等

导出类型 :数组,指针,结构,联合

空类型: void

储存类型:

储存类型决定变量的作用域、储存方式、生存期和初始变化方式。

作用域:标识符起作用的有效范围。作用域是代码块的为局部变量,作用域是文件的为全局变量。通俗地来说,就是能够“认识”标识符的范围。

生存期: 变量在程序执行过程中的有效期,即能在内存中存在的时间,有静态生存期动态生存期两种。变量的生存期可以类比为一个人的寿命。

静态变量和全局变量的生存期就像一个人的一生,由于其存储空间在程序运行前就已经分配好并一直存在于程序运行期间,所以它们的寿命也很长,类似于人的一生。

自动变量的生存期就像一个人的一天,每次函数执行时,都会为其分配存储空间,并在函数执行结束时释放空间,所以它们的寿命只有在函数执行期间。

动态变量的生存期就像一个人的一段时间,它的存储空间是在程序运行期间动态分配的,并且需要程序员手动管理其生存期。程序员可以随时释放它们的空间,就像人可以在一段时间之后结束自己的寿命。

初始化方式:是否有默认值,如何赋初值。 

储存方式:为变量分配使用内存空间的方式,可分为静态存储方式动态存储方式两种 。

一个程序将操作系统分配给其运行的内存空间分为4个区域。
(1)栈区(动态数据区):存储空间在程序运行期间由编译器自动分配释放。
(2)堆区:由程序员调用malloc等函数来主动申请的,需使用free 函数来释放。若程序员不释放,程序结束时可能由系统回收。
(3)全局区(静态数据区):存储空间是在编译时分配的,在整个程序执行期间静态区中的数据一直存在,程序结束后由系统释放。
(4)常量区:常量字符串就是放在这里的,程序结束后由系统释放。
(5)程序代码区:存放程序的二进制代码。

我们可以把计算机内存看成是一个大仓库,而栈区、堆区、全局区和常量区就是这个仓库中不同的储物柜。

栈区就像一个“玩具箱”,里面可以存放小玩具,比如积木、小汽车、玩偶等。每次玩具箱只能打开一个抽屉,放一个玩具,当你要取出玩具时,必须把上面的玩具依次取出来,直到取到你需要的玩具。当你玩完后,把玩具箱上的抽屉关上,就可以自动清空里面的玩具了。

堆区则像是一个“自由市场”,里面可以放置各种不同大小的物品,比如大件家具、电器、电脑等。你需要购买这些物品时,可以在市场中选择并购买,但是当你不需要这些物品时,需要自己负责处理它们,比如销毁、回收等。

全局区则像是一个“公共物品库”,里面放置的是大家共同需要的物品,比如共享自行车、公交车等。当你需要使用这些物品时,可以直接从物品库中取走并使用,当你使用完毕后,就需要将它们放回物品库中,供其他人继续使用。

常量区则像是一个“宝库”,里面放置着不可更改的珍贵物品,比如价值连城的宝石、文物等。这些物品不可更改,一旦存储到常量区中,就无法修改,只能被读取和使用

静态存储方式是指在程序运行之前,系统就为变量在全局区分配存储单元,并一直保持不变,直至整个程序结束。全局变量即属于此类存储方式。
动态存储方式是在程序运行过程中,执行到变量所在代码块时,系统为变量在栈区分配内存,当退出块时立即释放内存空间。函数的形式参数即属于此类存储方式,在函数被调用时,给形参在栈上分配存储空间,调用完毕立即释放。一个函数如果被多次调用,则反复地分配、释放形参变量的存储单元。
静态存储变量在程序执行过程中始终占据固定的储单元,其生存期是整个程序的执行时间;而动态存储变量在程序执行过程中动态地进行分配和释放,时而存在,时而消失,其生存期是所在代码块的执行时间。生存期和作用域是从时间和空间这两个不同的角度来描述变量的有效性,这两者既有联系,又有区别。全局变量具有静态生存期,而局部变量既可以有静态生存期,也可以有动态生存期。 

 自动变量(auto):

 局部变量的默认储存类型是auto,作用域是块范围,生存期短暂,没有默认初值,所以如果定义时未赋值是不确定的。

#include <stdio.h>

int main() {
    int x = 10;

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

    {
        int x = 20;

        printf("inner x is %d\n", x);

        {
            int x = 30;

            printf("innermost x is %d\n", x);
        }

        printf("outer inner x is %d\n", x);
    }

    printf("x is still %d\n", x);

    return 0;
}

在此程序定义了一个名为x的自动变量,并将其初始化为10。然后进入一个代码块,其中定义了一个新的自动变量x,其值为20。接着又进入一个更深的嵌套代码块,其中定义了另一个自动变量x,其值为30。注意,当我们在内层代码块中重新定义x时,它会遮盖外层代码块中的同名变量。因此,在内层代码块中,x的值为30,而在外层代码块中,x的值仍然为20。退出代码块时,内部定义的变量也会被销毁,因此,在最外层的printf语句中,再次打印变量x的值为10。 

 外部变量(extern):

 函数外定义的变量。作用域是从定义处开始的文件范围,储存方式是静态,定义时没有初始化则默认值为0。局部变量会屏蔽同名的外部变量。

不在作用域内引用需要添加引用性声明extern。

这为函数提供了一种可以代替return的返回多个值的方法 。

#include <stdio.h>

int num1, num2;

void getNumbers() {
    printf("Enter first number: ");
    scanf("%d", &num1);
    
    printf("Enter second number: ");
    scanf("%d", &num2);
}

void printNumbers() {
    printf("The numbers you entered are %d and %d\n", num1, num2);
}

int main() {
    getNumbers();
    printNumbers();
    
    return 0;
}

全局变量num1num2getNumbers()函数中被赋值,然后在printNumbers()函数中被使用。因为这些变量是全局的,所以它们在整个程序中都是可见的,而不仅仅是在函数中。所以,通过在函数中设置这些变量的值,可以将多个值返回到主函数中,而不需要使用return语句。

 在函数之外的引用性声明语句一直到文件结束都有效,在函数内则每次引用都要写extern。

 静态变量(static):

局部变量用static定义为静态局部变量,同样的全局变量可被定义为静态全局变量

静态变量被分配在全局区(静态数据区),生存期是整个程序执行期,默认初值为0。

静态局部变量:                                                         

作用域为程序块,但生存期是整个程序执行期间。定义在函数内部的静态局部变量只能被那个函数访问,在多次调用同一函数时变量能保持上次调用结束时的值。

静态全局变量:

static int x=1;

int main ( )

{

     extern int x;     //使用静态全局变量

 生存区和外部变量一样是整个程序块,区别是作用域是本文件,其他文件不能引用一个文件中的静态全局变量能屏蔽其他文件中同名的外部变量

寄存器变量(register):

自变量外生性检验 python_代码块

只能定义局部变量,可以提高程序的执行速度。函数的形参能够声明为register,但不能声明为extern和static。寄存器变量不能进行取地址运算