C语言中static关键字的神奇之处

来源:互联网 发布:java中printf格式化输 编辑:程序博客网 时间:2024/06/05 10:52

首先介绍static关键字

static翻译成汉语是:静止的;不变的,在C语言中主要有三个作用

1.static修饰局部变量

static修饰局部变量的作用是是数据保持的更久一些,同时static修饰的局部变量的存储区是在静态存储区的,被static修饰的变量可以称之为静态变量,若在定义是不显示的对它进行初始化,则编译器会对它隐式的初始化为0(全局变量也是相同的),它的生命周期是从定义开始处一直到程序运行结束,比如说下面的程序:

<span style="font-size:18px;">#include<stdio.h>#include<stdlib.h>int main(){static int a;     //声明静态变量a没有显示的初始化 所以编译器会隐式的初始化为0static int b = 10;    //声明静态变量b,它和a一样在静态存储区存储,生命周期在程序结束处int c = 20;  //普通变量  执行到这一步才会在栈区开辟空间进行初始化printf("a=%d\nb=%d\nc=%d\n", a, b, c);system("pause");return 0;}</span>

程序运行结果是:




2.static修饰全局变量

3.static修饰函数

static修饰全局变量和函数的时候的作用是一致的,就是修改连接属性,对于全局部变量和函数的声明默认的是具有外部连接属性的,就是通过extern关键字可以在别的文件中使用,但是如果static修饰了全局变量或者函数,那么它的连接属性就会变为内部连接属性,即就是只能在本源文件中使用,别的源文件不能使用它们。举个例子

#include<stdio.h>#include<stdlib.h>static int d = 10;    //声明全局静态变量int e = 10;static void fun1()      //函数用static修饰{printf("this is an example\n");}void fun2(){;}int main(){return 0;}

现在有一个源文件是a.c其中声明了静态全局变量 static int  d=10和static修饰的函数fun1(),如果想在另一个源文件中b.c使用,通过extern是不能办到的,因为它的连接属性已经被修改为内部链接属性。但是在b.c中可以在通过

extern int e = 10;

extern void fun2();

在b.c中就可以使用它们了,因为它们的连接属性是外部的。


1 0