`
8366
  • 浏览: 799078 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

static作用(修饰函数、局部变量、全局变量)

阅读更多

C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。

1)先来介绍它的第一条也是最重要的一条:隐藏。

当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c

下面是a.c的内容

char a = 'A'// global variable
void msg() 
{
    printf(
"Hello\n"); 
}

 下面是main.c的内容

int main(void)
{    
    
extern char a;    // extern variable must be declared before use
    printf("%c ", a);
    (
void)msg();
    
return 0;
}

程序的运行结果是:

 

A Hello

你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

如果加了static,就会对其它源文件隐藏。例如在amsg的定义前加上staticmain.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

2static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。

#include <stdio.h>

int fun(void){
    
static int count = 10;    // 事实上此赋值语句从来没有执行过
    return count--;
}

int count = 1;

int main(void)
{    
    printf(
"global\t\tlocal static\n");
    
for(; count <= 10++count)
        printf(
"%d\t\t%d\n", count, fun());    
    
    
return 0;
}

 程序的运行结果是:

global          local static

1               10

2               9

3               8

4               7

5               6

6               5

7               4

8               3

9               2

10              1

3static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。不妨做个小实验验证一下。

#include <stdio.h>

int a;

int main(void)
{
    
int i;
    
static char str[10];

    printf(
"integer: %d;  string: (begin)%s(end)", a, str);

    
return 0;
}

程序的运行结果如下

integer: 0; string: (begin)(end)

最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。

以上内容出自博客园Mr. Write之手,写的相当清晰易懂,存档方便复习。原文地址:http://www.cnblogs.com/dc10101/archive/2007/08/22/865556.html

下面是中兴通讯2012校招笔试题的一道问答题:

1. static全局变量与普通的全局变量有什么区别 ?

  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

  全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式 这两者在存储方式上并无不同。

   这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错 误。 

  static全局变量只初使化一次,防止在其他文件单元中被引用;   

2.  static局部变量和普通局部变量有什么区别 ?

   把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。  

  static局部变量只被初始化一次,下一次依据上一次结果值;   

3.  static函数与普通函数有什么区别?

    static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前 源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.

  static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

 

 

转自:http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html

分享到:
评论

相关推荐

    C语言中static的作用.pdf

    当static用于函数内部的局部变量时,它使得该变量变为静态局部变量。静态局部变量只在第一次进入其所在函数时初始化一次,并且其生命周期从程序开始运行持续到程序结束,而不是每次函数调用时都重新初始化。即使函数...

    深入理解C语言 static、extern与指针函数

    •虽然static修饰变量的生存期很长,但它始终是局部变量,不能在其他函数中使用•static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 全局变量...

    函数的程序设计实验.doc

    静态全局变量:静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包 含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键 字修饰过的变量具有文件作用域。这样即使两个...

    快速了解C语言静态关键字static的作用

    2、用static修饰的局部变量,会延长局部变量的寿命,超出函数的生存期 3、对静态关键字修饰的局部变量的初始化 以下面两个变量a和变量为b进行说明,在编译过程中,发现变量a和b是静态变量,会标识变量a与b,等到程序...

    2023-04-06-项目笔记-第一阶段-12.2.3修饰函数

    2023-04-06-项目笔记-第一阶段- 8.循环语句 8.1while循环的实例 9.函数 9.1函数的使用 10....常见关键字 12.1关键字 typedef 12.2关键字static 12.2.1修饰局部变量 12.2.2修饰全局变量 12.2.3修饰函数

    浅谈C/C++中的static与extern关键字的使用详解

    一.C语言中的static关键字在C语言中,static可以用来修饰局部变量,全局变量以及函数。在不同的情况下static的作用不尽相同。(1)修饰局部变量一般情况下,对于局部变量是存放在栈区的,并且局部变量的生命周期在该...

    2023-04-06-项目笔记-第一阶段-12.2.2 修饰全局变量

    2023-04-06-项目笔记-第一阶段- 8.循环语句 8.1while循环的实例 9.函数 9.1函数的使用 10.数组 10.1.数组的使用 11....常见关键字 12.1关键字 typedef 12.2关键字static 12.2.1修饰局部变量 12.2.2修饰全局变量

    C语言中static的作用及C语言中使用静态函数有何好处

    一是隐藏功能,对于static修饰的函数和全局变量而言 二是保持持久性功能,对于static修饰的局部变量而言。 三是因为存放在静态区,全局和局部的static修饰的变量,都默认初始化为0 下面我逐一给大家介绍: (1)先...

    C#中static静态变量的用法实例

    使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型   静态全局变量 定义:在全局变量...

    函数调用与堆栈

    把程序运行时一个变量占有内存空间的时间段...在定义局部变量时,可以为它们加上存储类修饰符auto、static和register来指出它们的生存期。 定义为static存储类型的局部变量具有静态生存期,它们也被存放在静态数据区。

    探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题

    一. 在c中分为这几个存储区1.栈 – 由编译器自动分配释放2.堆 – 一般由程序员分配释放,若...在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变

    为何关键字static在面试中频频被问?

    关键字static的神奇妙用 在今天的学习中,我了解到关键字...static修饰函数,那么该函数只能在本文件有效,只能在本文件使用。 #这就是我想分享给大家的,希望对你们有所帮助。 #欢迎大家留言指正! 作者:清风彬

    C++ static关键字的原理及用法详解

    `static`关键字在C++中的使用确实涉及到多个方面,包括局部变量的存储期、全局变量和函数的链接属性,以及类成员的访问方式。正确使用`static`关键字可以帮助我们更好地管理变量的生命周期和访问范围,以及实现类的...

    2023-04-06-项目笔记-第一阶段-14.指针 14.3指针变量的大小

    2023-04-06-项目笔记-第...常见关键字 12.1关键字 typedef 12.2关键字static 12.2.1修饰局部变量 12.2.2修饰全局变量 12.2.3修饰函数 13.#define 定义常量和宏 14.指针 14.1内存 14.2指针的使用实例 14.3指针变量的大小

    C学习深入学习总结

    2.3 static修饰的全局变量和函数,在其他的文件中是否可以访问?如何访问? 5 2.4 你知道static是c语言中实现封装和隐藏的利器吗?你是否经常使用? 5 2.5 定义在不同源文件中的static全局变量,编译器是否允许他们...

    2023-04-06-项目笔记-第一阶段-13.#define 定义常量和宏

    2023-04-06-项目笔记-第一阶段- 9.函数 9.1函数的使用 10.数组 10.1....常见关键字 12.1关键字 typedef 12.2关键字static 12.2.1修饰局部变量 12.2.2修饰全局变量 12.2.3修饰函数 13.#define 定义常量和宏

    C/C++中的static的联系和区别

     在进程开始运行时初始化,C中static修饰变量和函数  静态变量  存储于全局变量区  静态局部变量:进程的运行过程中,函数退出不被销毁  静态全局变量:只能被本文件的函数调用访问,对其他源文件不可见  ...

    2023-04-06-项目笔记-第一阶段-14.指针 14.1内存

    2023-04-06-项目笔记-第一阶段- 9.函数 9.1函数的使用 10....常见关键字 12.1关键字 typedef 12.2关键字static 12.2.1修饰局部变量 12.2.2修饰全局变量 12.2.3修饰函数 13.#define 定义常量和宏 14.指针 14.1内存

Global site tag (gtag.js) - Google Analytics