您的位置:首页 > 编程语言 > C语言/C++

C语言中static关键字用法小结

2015-07-07 20:42 323 查看
C语言中定义的static关键字主要有两个作用。(C++对它进行了扩展,有三个作用。)

第一个作用是修饰变量,又可分为修饰全局变量和修饰局部变量两种情况。

1.修饰全局变量:全局变量的值存放在栈上,其存储类型为静态存储类型,不管有没有在其前加static关键字,因此,全局变量的作用域为从定义全局变量起始处到文件结尾处。没有加static关键字的全局变量,除了可以在其定义的文件之中被引用外,其他文件也可以通过使用extern声明来引用它。但是,加了static关键字的全局变量,其他文件即使使用extern声明也无法引用它。

2.修饰局部变量:若局部变量前没有加static关键字,则其值存放在堆上,存储类型为动态存储类型,作用域为从变量定义起始处到函数结束处,可以被初始化任意次,若未指定初始化值,则默认初始化值是一个任意数。若局部变量前加了static关键字,则其值存放在栈上,存储类型为静态存储类型,作用域为从变量定义起始处到文件结尾处,只能被初始化一次,若未指定初始化值,则默认初始化值为0。如以下代码:

#include <stdio.h>

static LocalVal()

{

static int a;//初始化一次,初始化值为0

printf("%d\n",a);

a++;

}

void main()

{

staticLocalVal();//输出结果为0

staticLocalVal();//输出结果为1

}

static关键字修饰的变量一般不能作为函数形参。像下面这段代码,VC下编译,会给出一个警告,然后忽略static。

#include <stdio.h>

staticLocalVal(static int a)//VC下编译,a的地址为0x0012ff2c,处于堆地址,可见static被忽略掉了

{

printf("%d\n",a);

}

void main()

{

int i;

i=2;

StaticLocalVal(i);

i=5;

StaticLocalVal(i);

}

static.c(3) : warning C4042: 'a' : has bad storage class

一个函数中定义的static变量,能不能被其他函数引用呢?

在VC下运行如下代码,会出来两个连接错误,可见,静态局部变量,只能在其定义的函数内部使用。

#include <stdio.h>

staticLocalVal()

{

static int a=2;

printf("%d\n",a);

}

CallStaLocVal()

{

extern int a;

printf("%d",a);

}

void main()

{

StaticLocalVal();

CallStaLocVal();

}

static.obj : error LNK2001: unresolved external symbol _a

Debug/static.exe : fatal error LNK1120: 1 unresolved externals

第二个作用是修饰函数。

static修饰函数,不改变函数的存储类型,只是改变函数的作用域。没有加static的函数,其他文件可以通过使用extern来调用函数,若函数前加了static关键字,则该函数只能在本文件中使用(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的文件时,不用担心自己定义的函数,会与其他人写的函数同名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: