Exercises

image


image


image


### Auto自动化变量

自动存储类别是默认的存储类别,通常用于在”函数内部定义的局部变量“。这些变量会在程序执行到其定义的代码块时对应的栈空间被创建,函数执行完毕后变量对应栈空间会自动销毁。
示例:
int main() //宿主
{
     auto int data;//寄生虫 auto int data; 局部变量就是自动化变量 申请出来的栈空间在函数返回结束的时候会被释放掉
     
     return 0;
} 

auto变量的特点:
    默认存储类:auto是C语言中局部变量的默认存储类。如果你在定义变量时没有显式地指定存储类,那么它将被视为auto类型。
    
    自动分配内存:auto变量在进入其作用域时分配内存,并在离开作用域时释放内存。这意味着它们的生命周期与其所在的函数或代码块的执行时间相对应。
    未初始化的值不确定:auto变量如果没有显式初始化,其初始值将是不确定的。它们的值取决于它们在内存中的位置和之前在该内存位置上存储的数据。
    块级作用域:auto变量的作用域限制在定义它们的代码块内。它们不能被其他代码块或函数直接访问。
    
    隐藏性:可以在不同的代码块中使用同名的auto变量,这样它们将具有不同的作用域,并且互不影响。这种名称隐藏可以帮助实现信息的封装和模块化设计。

PS:(所有局部变量默认是自动化变量)一般局部变量的空间存放在栈空间里面,函数退出,他的空间也会跟着被释放,那你如果还去获取它的数据,那就是非法内存地址访问。很有可能导致程序崩溃段错误。


### register寄存器变量
寄存器变量,不是存储在内存条里面的,所有这种变量没有内存地址,所以不能&寄存器变量名。

示例:
int main() //宿主
{
     register int data;//寄生虫 auto int data; 局部变量就是自动化变量 申请出来的栈空间在函数返回结束的时候会被释放掉
} 
register特点:
    快速访问:寄存器变量理论上可以比存储在内存中的变量更快地进行访问,因为寄存器是CPU内部的一部分,访问速度极快。
    局部变量:register存储类只能用于局部变量和函数参数,不能用于全局变量或静态变量。
    限制使用地址运算符(&):由于寄存器变量可能(编译器优化了)不会真正存储在内存中,而是在寄存器中,所以不允许对寄存器变量使用地址运算符&。这意味着你不能获取寄存器变量的地址。
    编译器优化建议:register只是对编译器的一种建议,而不是强制要求。现代编译器会根据具体情况来决定是否将一个变量放入寄存器,即使没有使用register关键字,编译器也可能会自动优化一些变量到寄存器中。
    有限的寄存器数量:CPU的寄存器数量有限,因此如果太多变量使用register关键字,编译器可能会忽略一些请求,并且将这些变量存储在内存中。

### 外部变量 - extern
示例1:修饰全局变量

    extern int a;//注意这里并不是定义a申请空间!而是声明a为外部extern变量,a已经在其他位置定义(申请4个字节的空间)了这里只是声明

示例2:修饰函数(默认已经修饰了),在函数声明的时候修饰
    extern int Fun();//extern可以写,写了提高代码可读性
    
基本作用:
    ① 不能修饰局部变量,只能修饰全局作用域:全局变量和函数
    ② 修饰全局变量:该全局变量能在对应修饰的.c模块中使用
    ③ 修饰函数:该函数能在其他.c模块中被调用(其实不需要修饰,函数声明的时候默认就是外部变量)、

extern的特点:
    ① 外部引用:extern关键字声明一个变量或函数是在其他地方定义的,而不是在当前”文件中“定义的。这使得不同的文件可以共享同一个变量或函数。
    ② 避免重复定义:通过使用extern关键字,可以在多个文件中引用同一个全局变量或函数,而不会导致重复定义错误。
    ③ 全局作用域:被extern声明的变量或函数通常具有全局作用域,这意味着它们可以在整个程序中被访问,只要有相应的声明。
    ④ 在头文件中的应用:extern关键字常常在头文件中使用,以便将变量和函数的声明提供给多个源文件.c文件。
    ⑤ 延迟定义:extern关键字只是声明一个变量或函数的存在,而不实际分配存储空间或定义它们的具体内容。实际的定义必须在某个源文件中进行。

extern是用来声明修饰变量的,被声明的变量指定的这个变量是 外面模块的变量,但是外面的变量只有一个

### static
示例1:在"定义"局部变量的时候,修饰变量让变量只”初始化一起“,被修饰的变量称为静态变量. 设置变量的存储域。
    int Fun()
    {
        static int a = 2;
        return 0;    
    }
    
示例2:在函数“声明”和”定义“的时候修饰,让该函数变成静态函数.   限制变量的作用域。
在C语言中,函数的静态属性必须在定义时明确指出。因此,只在声明时使用static关键字,而在定义时不使用static关键字是不可行的。这会导致编译器认为这是两个不同的函数(二义性),从而产生错误。
    static int Fun();
    static int Fun()
    {
     printf("I'm Fun\n");
     return 0;     
    }
    
static的特点:
    ① 静态变量:在函数内部使用static关键字声明的局部变量称为静态局部变量。与普通局部变量不同的是,静态局部变量的生命周期会持续到程序的结束。它们在第一次执行时被初始化,并在后续调用中保留其值。
    
    ② 静态函数:使用static关键字声明的函数具有文件范围,即它们只能在定义它们的文件中可见,不能被其他文件所调用。这也意味着静态函数与文件相关联,而不是与程序的整个执行过程相关联。
    
    ③ 静态全局变量:在全局范围内使用static关键字声明的变量具有文件范围,只能在声明它们的文件中可见,不能被其他文件所访问。这意味着它们对于整个程序来说是私有的,不会与其他文件中相同名称的变量发生冲突。
    
    ④ 限制外部链接:在C语言中,static关键字还可以限制变量和函数的外部链接性,使得它们只能在当前文件中使用,而不能被其他文件引用。

posted @ 2024-06-21 19:58  WJnuHhail  阅读(5)  评论(0编辑  收藏  举报