函数中的static变量 变量实际中有什么作用

c语言中Static 变量与全局变量有什么区别?
[问题点数:100分,结帖人qianqiansong]
c语言中Static 变量与全局变量有什么区别?
[问题点数:100分,结帖人qianqiansong]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|若一个外部变量的定义形式为 其中static的作用是
本回答由提问者推荐
var sogou_ad_id=731547;
var sogou_ad_height=160;
var sogou_ad_width=690;博客访问: 119311
博文数量: 69
博客积分: 40
博客等级: 民兵
技术积分: 355
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
原文地址: 作者:
Static翻译出来是“静态”“静止”的意思,在C语言中的意思其实和它的本意差不多,表示“静态”或者“全局”的意思,用来修饰变量和函数。经static修饰过后的变量或者函数的作用域或者存储域会发生变化,而由static修饰的变量在初始值方面也会表现出static关键字的优势。想知道经static修饰过后的变量或者函数的作用域或者存储域发生了什么变化吗,发生变化的原因是什么吗?请大家继续往下看!
一、c程序的内存分布
既然static是用来修饰变量和函数的,而变量和函数又是组成必不可少的,C程序的内存分布图如下。
c程序内存分布图
上面的C程序分布图很明显的告诉我们,变量是存储在栈区或者堆区或者bss段或者data段,变量的存储域为什么会有所不同呢?其实原因很简单,说白了就是与他们定义在程序的不同地方,有没有static关键字修饰有关啦,定义在不同的地方也说明了他们有着不同的作用域。
二、static修饰的变量
&&&&&&&&&&&
三、Static修饰的函数
(1)第一个作用:隐藏。
static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。
增加这条语句
A;&//&global&variable
a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。
static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。
static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
main.c的内容
void&msg();
了解更多请关注:
粤嵌新浪微博:
粤嵌腾讯微博:
阅读(19807) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
函数里的和函数外的static变量有什么区别c里面的静态变量问题
作业帮用户
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
首先说一下什么是静态变量(常量也是一样的道理),你可以这么理解,不管哪声明的静态变量,其实都可以当作全局变量,但和普通的全局变量不同的是该静态变量只能在其声明的作用域中使用,出了这个作用域就不能用了.那么你的问题也就出来了,在函数内声明的静态变量其实就是一个全局变量,只不过它只能在函数内部用;在函数外声明的,有两种,一种是类中的成员(C++的概念,既然你问c这里就不赘述了),另外一种就是文件作用域的静态变量,有文件作用域的静态变量只能在包含它的.c文件中使用,如果是声明在头文件中的静态变量,那么在不同的.c文件包含它的时候,会各自生成一个独立的副本,也就是说每个包含它的.c文件中的该变量其实是互不相干的;而有文件作用域的静态变量和在当前.c文件下全局变量是一样的,不一样的是其他.c中的情况.那么在函数内声明的静态变量和函数中的局部变量有什么区别呢?区别就是静态变量只有第一次运行函数的时候被创建,并且在函数结束的时候不会消亡;而普通的成员在函数结束的时候就会在内存中退栈消亡.说了那么多,举个例子://Ex_1.cvoid fun_1 (){static int a = 0;a ++;printf ("%d",a);}void fun_2 (int times){int i = 0;for (;i < i++){fun_1 ();}}之后再执行fun_2的话,就会依次打印:12345.直到times;如果去掉static关键字,执行fun_2,屏幕就会打印111111...次数为times次;下面举例说明一下函数外的://H.h#ifndef _H_H_#define _H_H_static int a = 0;#endif//Ex_2.c#include "H.h"void fun_ex2 (){a++;printf ("%d",a);//这时会打印1}//Ex_3#include "H.h"void fun_ex3 (){printf ("%d",a);//这时打印的依然是0,即便先被Ex_2中的fun_ex2()函数修改过,因为他们 //是两个独立的副本}额,说的太啰嗦了,
为您推荐:
其他类似问题
扫描下载二维码static 变量实际中有什么作用?
求大神解答一下:static变量在Java程序中,有什么样的作用,度量说在Java虚拟主机中并没有全局变量这样子的说法?那么,static变量在实际的Java操作中会有什么作用呢?
很开心,谢谢亲爱的
写下你的评论...
所有的类所共享的数据?求大神再点明一下下
写下你的评论...
写下你的评论...
Copyright (C) 2018 imooc.com All Rights Reserved | 京ICP备 号-11

我要回帖

更多关于 类中static变量赋值 的文章

 

随机推荐