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

转载 2015年07月07日 20:42:11

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关键字,则该函数只能在本文件中使用(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的文件时,不用担心自己定义的函数,会与其他人写的函数同名。

相关文章推荐

static关键字用法小结【转帖】

static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准).  (1)局...

c语言中static用法总结.pdf

  • 2012年03月29日 10:41
  • 141KB
  • 下载

c语言中static_用法总结.doc

  • 2011年09月14日 01:54
  • 32KB
  • 下载

C语言之结构体、枚举、预处理和static,extern关键字 易错知识点

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1.   结构体 数组和结构体的区别:   数组:只能由多个相同类型的数据构成   结构体...

c语言static用法总结

  • 2011年07月18日 16:17
  • 41KB
  • 下载

C语言中关键字auto、static、register、const、volatile、extern的作用

这些关键词都是c++基础知识,我整理了一下,希望对新学的朋友们有用: (1)auto    这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局...
  • ebw123
  • ebw123
  • 2016年05月14日 21:29
  • 359

C语言static关键字解析 【转】

转载地址:http://blog.csdn.net/wu_zf/article/details/70683261、概述   static 声明的变量在C语言中有两方面的特征:   1)、变量会被放在程...

C语言中关键字auto、static、register、const、volatile、extern的作用

C语言中关键字auto、static、register、const、volatile、extern的作用 网址:http://www.cnblogs.com/candyming/archive/201...

C语言 Static关键字

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量...

黑马程序员——C语言的关键字 typedef,static,extern和预处理指令

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流——-typedef一、typedef的作用给已经存在的数据类型起一个新的名字 定义格式:typedef 原有类型名 新名...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言中static关键字用法小结
举报原因:
原因补充:

(最多只允许输入30个字)