C语言 静态变量static的用法

static有两个作用

第一个作用: 修饰变量,变量又分为局部和全局变量,但他们都存在内存的静态区

              静态全局变量,作用于仅限于变量被定义的文件。其他文件即使用extern声明也没法使用,准确说就是作用域是从定义处开始,到文件结束,

                       在定义处之前的那些代码不能使用它。

              静态局部变量,在函数里定义,就只能在这个函数里使用,同一个文档中的其他函数也是用不了的。由于被static修饰的变量总是存在内存的

                      静态区。所以即使这个函数运行结束,这个静态变量的值不会被销毁,函数下次使用时仍能使用。

第二个作用:修饰函数

              函数前加static使得成为静态函数,但此处的“static”的含义不是指存储,而是只对对函数的作用域仅限于本文件(所以有内部函数)
             关键字static有着不寻常的历史,起初在C中表示退出一个块后仍然存在的局部变量,之后在C中又有了第二种含义:用来表示被其他
                        文件访问的全局变量和函数。

[html]  view plain  copy
  1. <pre name="code" class="html">//关键字static的用法  
  2. #include<stdio.h>  
  3. #include<stdlib.h>  
  4.   
  5. static int n;//定义的静态全局变量      
  6. int   fun1()  
  7. {  
  8.    static int m=0;//静态局部变量  
  9.    m++;  
  10.    return m;  
  11. }  
  12. int  fun2()  
  13. {  
  14.         n=0;  
  15.     n++;  
  16.     return n;  
  17.   
  18. }  
  19. int main()  
  20. {  
  21.     int i;  
  22.     for(i=0;i<10;i++)  
  23.     {  
  24.        fun1();//m为静态局部变量   这个函数运行结束,这个静态变量的值不会被销毁,函数下次使用时仍能使用。  
  25.   
  26.        fun2();//n 静态全局变量 作用于仅限于变量被定义的文件。  
  27.     }  
  28.     printf("m = %d\n",fun1());  
  29.     printf("n = %d\n",fun2());  
  30. system("pause");  
  31. return 0;  
  32. }  

输出结果:


<think>好的,我现在需要回答用户关于C语言static关键字的用法。首先,我应该先整理自己已知的知识,并参考提供的引用资料来确保信息准确。 首先,我记得static在C语言中有两种主要用途:修饰变量和修饰函数。不过根据用户提供的引用,好像有三种用法?比如引用[2]提到三种,但可能第三种是修饰函数时的不同情况?或者可能有其他的用法?需要仔细看一下提供的引用内容。 引用[1]提到static有两种基本用法:修饰变量和函数。但引用[3]提到static函数的作用域限制,这可能属于修饰函数的用法。而引用[2]提到了三种,可能包括变量在局部和全局的不同情况?比如,当static修饰局部变量时,改变存储期;修饰全局变量时,改变链接属性;修饰函数时同样改变链接属性。这可能就是三种用法。 接下来,我需要按照用户的要求,结构清晰,分点说明。用户的问题是关于使用说明,所以应该详细说明每个用法的场景、效果以及例子。 首先,修饰局部变量。static局部变量会将变量的存储期从自动变为静态,即使函数结束,变量值仍然保留。例如在函数内部声明static int count = 0; 这样每次调用函数时,count的值不会重新初始化,而是保持上次调用后的值。这在需要统计函数调用次数时非常有用。 其次,修饰全局变量。通常全局变量具有外部链接属性,其他文件可以通过extern来访问。但用static修饰后,全局变量的链接属性变为内部,只能在当前文件内访问,避免命名冲突。例如在file.c中声明static int globalVar; 那么其他文件无法引用这个变量,增强了封装性。 第三,修饰函数。默认情况下,函数是extern的,可以被其他文件访问。但使用static修饰函数后,该函数只能在声明它的文件内使用,其他文件无法调用。这有助于隐藏实现细节,提高模块化。例如在工具函数中,如果不希望被外部使用,可以声明为static。 需要确保每个用法都有例子,并且符合用户给出的引用资料中的内容。例如引用[3]提到static函数的作用域仅在本文件,这和修饰函数的用法一致。引用[1]也提到static修饰变量和函数的基本用法,而引用[2]虽然提到三种,但可能将变量分为局部和全局两种情况,加上函数的情况,组成三种用法。 此外,还需要注意语法正确性,比如变量声明的位置和使用方式。例如,在函数内部使用static局部变量,或者在文件作用域使用static全局变量。同时,要指出使用static的好处,如提高安全性、可维护性,避免命名冲突等,如引用[1]和[3]所提到的。 可能还需要对比不使用static的情况,比如普通局部变量和static局部变量的区别,普通全局变量static全局变量的区别,普通函数和static函数的区别。这样用户可以更清楚理解其作用。 最后,生成相关问题时要围绕static的不同用法、应用场景、优缺点等,确保问题具有针对性和启发性。</think>### C语言中`static`关键字的使用说明 `static`是C语言中的存储类说明符,主要作用包括**改变变量的存储期或作用域**,以及**限制函数或全局变量的可见性**。以下是具体用法及示例: --- #### 1. **修饰局部变量** 当`static`修饰局部变量时,变量的**存储期**从自动存储期(函数调用时分配,结束时释放)变为静态存储期(程序运行期间始终存在),但**作用域仍限于函数内部**。 **示例**: ```c void counter() { static int count = 0; // 静态局部变量 count++; printf("调用次数:%d\n", count); } ``` - **效果**:每次调用`counter()`时,`count`的值会保留上次调用的结果。 - **用途**:统计函数调用次数、保留状态信息等[^1][^3]。 --- #### 2. **修饰全局变量** 当`static`修饰全局变量时,变量的**链接属性**从外部链接(允许其他文件通过`extern`访问)变为内部链接(仅当前文件可见)。 **示例**: 在文件`file1.c`中: ```c static int internal_var = 10; // 静态全局变量,仅file1.c可见 ``` 在文件`file2.c`中无法通过`extern`引用`internal_var`。 - **用途**:避免多文件编程时的命名冲突,增强封装性[^1][^3]。 --- #### 3. **修饰函数** 当`static`修饰函数时,函数的**链接属性**从外部链接变为内部链接,即该函数仅能在定义它的文件中调用。 **示例**: 在文件`utils.c`中: ```c static void helper() { // 静态函数,仅utils.c可用 // 辅助逻辑 } ``` 其他文件无法调用`helper()`。 - **用途**:隐藏工具函数,提高模块化设计。 --- #### 核心优势 - **安全性**:限制变量/函数的作用域,防止误用。 - **可维护性**:明确变量/函数的可见范围,降低代码耦合。 - **内存管理**:静态局部变量避免重复初始化和释放,提升效率[^3]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值