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

C语言中定义的static关键字主要有两个作用。(C++对它进行了扩展,有三个作用。)
第一个作用是修饰变量,又可分为修饰全局变量和修饰局部变量两种情况。
1.修饰全局变量:全局变量的值存放在栈上,其存储类型为静态存储类型,不管有没有在其前加static关键字,因此,全局变量的作用域为从定义全局变量起始处到文件结尾处。没有加static关键字的全局变量,除了可以在其定义的文件之中被引用外,其他文件也可以通过使用extern声明来引用它。但是,加了static关键字的全局变量,其他文件即使使用extern声明也无法引用它。
2.修饰局部变量:若局部变量前没有加static关键字,则其值存放在堆上,存储类型为动态存储类型,作用域为从变量定义起始处到函数结束处,可以被初始化任意次,若未指定初始化值,则默认初始化值是一个任意数。若局部变量前加了static关键字,则其值存放在栈上,存储类型为静态存储类型,作用域为从变量定义起始处到文件结尾处,只能被初始化一次,若未指定初始化值,则默认初始化值为0。如以下代码:

#include<stdio.h>

StaticLocalVal()
{
staticinta;//初始化一次,初始化值为0
printf("%dn",a);
a++;
}
voidmain()
{

StaticLocalVal();//输出结果为0
StaticLocalVal();//输出结果为1
}
static关键字修饰的变量一般不能作为函数形参。像下面这段代码,VC下编译,会给出一个警告,然后忽略掉static。

#include<stdio.h>
C语言中static关键字用法小结 java static关键字

StaticLocalVal(staticinta)//VC下编译,a的地址为0x0012ff2c,处于堆地址,可见static被忽略掉了
{
printf("%dn",a);
}
voidmain()
{
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()
{
staticinta=2;
printf("%dn",a);
}

CallStaLocVal()
{
externinta;
printf("%d",a);
}

voidmain()
{
StaticLocalVal();
CallStaLocVal();
}
static.obj : error LNK2001: unresolved external symbol _a
Debug/static.exe : fatal error LNK1120: 1 unresolvedexternals

第二个作用是修饰函数。
static修饰函数,不改变函数的存储类型,只是改变函数的作用域。没有加static的函数,其他文件可以通过使用extern来调用函数,若函数前加了static关键字,则该函数只能在本文件中使用(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的文件时,不用担心自己定义的函数,会与其他人写的函数同名。

  

爱华网本文地址 » http://www.413yy.cn/a/25101013/185454.html

更多阅读

VB中,EOF是什么意思? c语言中eof是什么意思

VB中,EOF是什么意思?EOF就是文件末尾的意思,end of file。EOF()函数的参数是一个已经打开的文件的句柄(也就是标识符)。在打开文件进行操作的过程中,文件指针有可能被移动,当指针被移动到文件末尾时EOF()函数返回True。*********返回

关于C语言中的restrict关键字 c语言关键字

一、新的C语言:一切都源于FORTRAN(restrict的历史)http://www.chinaunix.net/ 作者:phoneix 发表于:2007-06-17 09:18:45此篇文章摘取于即将登载于《Dr.Dobb's 软件研发》第三期(2003年10月)的《The New C:一切源于FORTRAN》,文章主要是介

模拟c++中的strstr函数 c语言中strstr函数

/************************************************************************//* 例子:请写出一个函数来模拟c++中的strstr函数:该函数的返回值是主传中字符子串的位置以后的所有字符,请不要使用任何c程序已有的函数函数名: strstr函

C语言中scanf函数输入回车符的问题 c语言scanf连续输入

在用c语言编写输入语句的时候常用到scanf函数,初学者在刚用scanf函数输入时,经常会遇到各种各样的输入错误,最重要的是一定要记住scanf函数的输入格式,scanf函数里包含了哪些东西,输入的时候就必须有哪些东西,比如:scanf("%c%c%c"),那么输入

C语言中的static函数 c语言中的变量

内部函数和外部函数函数一旦定义后就可被其它函数调用。 但当一个源程序由多个源文件组成时, 在一个源文件中定义的函数能否被其它源文件中的函数调用呢?为此,C语言又把函数分为两类:一、内部函数如果在一个源文件中定义的函数只能被本

声明:《C语言中static关键字用法小结 java static关键字》为网友傲视之巅分享!如侵犯到您的合法权益请联系我们删除