全局变量和局部变量(static,extern,volatile)

 一,全局变量和局部变量概念

1,作用域

能使用某个变量的所有语句叫做变量的作用域。

声明在函数内部的变量叫局部变量,局部变量的作用域是它所在函数内部的所有语句,声明在所有函数外边的变量叫全局变量,它们的作用域是程序中的所有语句。

2,全局变量

全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

3,局部变量

静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

二,static三种不同的用法:1.修饰函数,2.修饰局部变量,3.修饰全局变量。

1,static修饰函数:static函数与普通函数的区别

(1)用static修饰的函数,限定在本源码文件中使用,不能被本源码文件以外的代码文件调用。

(2)普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。

若在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:

<1> 其他文件中可以定义相同名字的函数,不会发生冲突。

<2> 静态函数不能被其他文件所用。

void fn(void)
{
    int n = 10;
 
    printf("n=%d\n", n);
    n++;
    printf("n++=%d\n", n);
}
 
void fn_static(void)
{
    static int n = 10;
 
    printf("static n=%d\n
### static关键字 - **含义**:`static`用于改变变量或函数的存储方式作用域。 - **用法**: - **修饰局部变量**:变量会被放在程序的全局存储区中,下一次调用时还可保持原来的赋值,仅在变量的作用范围内可见。例如: ```c void func() { static int count = 0; count++; printf("%d\n", count); } ``` - **修饰全局变量**:改变了全局变量的作用域,使其不能被别的程序`extern`,限制在了当前文件里,但存放位置仍在全局静态储存区。例如: ```c // file1.c static int global_static_var = 10; // file2.c // 无法通过extern使用global_static_var ``` - **修饰函数**:函数的作用域被限制在当前文件内,其他文件无法调用。例如: ```c // file1.c static void static_func() { printf("This is a static function.\n"); } ``` - **特点**:静态变量或静态函数只有本文件内的代码才可访问,其名字在其它文件中不可见。在函数体内生成的静态变量,其有效期等于整个程序的有效期[^1]。 ### volatile关键字 - **含义**:`volatile`告知编译器该变量的值可能会在当前线程外部被改变,每次访问该变量时都要重新读取。 - **用法**:在多线程或硬件交互等场景中使用。例如: ```c volatile int intSignal; ``` - **特点**:一个参数既可以是`const`同时是`volatile`,是`volatile`因为它可能被意想不到地改变,是`const`因为程序不应该试图去修改它。例如在多线程中,如果一个变量可能被其他线程修改,就需要用`volatile`修饰,避免编译器进行优化导致程序出现问题[^2]。 ### extern关键字 - **含义**:`extern`意为“外来的”,用于告诉编译器有这个变量或函数,它可能不存在当前的文件中,但肯定存在于工程中的某一个源文件中或者一个DLL的输出中。 - **用法**: - **声明变量**:在一个文件中声明在其他文件中定义的全局变量。例如: ```c // file1.c int global_var = 20; // file2.c extern int global_var; ``` - **声明函数**:在一个文件中声明在其他文件中定义的函数。例如: ```c // file1.c void func() { printf("This is a function.\n"); } // file2.c extern void func(); ``` - **特点**:`extern`只是声明,不分配内存,变量或函数的定义要在其他地方进行。 ### 区别 - **作用域存储方式**:`static`改变变量或函数的作用域存储方式;`volatile`不改变作用域存储方式,主要影响编译器的优化;`extern`不改变作用域存储方式,用于跨文件访问变量或函数。 - **使用场景**:`static`用于限制变量或函数的作用域,保持变量的值;`volatile`用于多线程或硬件交互场景;`extern`用于在多个文件中共享变量或函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒听雪落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值