热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

博图静态变量static的作用

本文主要介绍关于C语言的知识点,对【static的作用】和【博图静态变量static的作用】有兴趣的朋友可以看下由【qccqo】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的【程序人生】相关技术

本文主要介绍关于C语言的知识点,对【static的作用】和【博图静态变量static的作用】有兴趣的朋友可以看下由【qccqo】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的【程序人生】相关技术问题。

博图静态变量static的作用

1.static有什么用途?(请至少说明两种)

??? 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

??? 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

??? 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用

? ? 以上是c的内容,对于c++请看以下三个示例之后的部分!!!

? ? 1)示例:

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

1 #include
  
    2 3 int fun(void) 4 { 5 static int count = 10; //事实上此赋值语句从来没有执行过 6 return count--; 7 } 8 9 int count = 1; 10 11 int main(void) 12 { 13 printf("global\t\tlocal static\n"); 14 for(; count <= 10; ++count) 15 printf("%d\t\t%d\n", count, fun()); 16 return 0; 17 } 
  

?

程序的运行结果是:

?global?local?static?

1?10?

2?9?

3?8?

4?7?

5?6?

6?5?

7?4?

8?3?

9?2?

10?1?

?

? ? 2)示例:

? ? 它的第二条也是最重要的一条:隐藏。?
? ? 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。?下面是a.c的内容?

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

? ? 下面是main.c的内容

1 int main(void) 
2 { 
3     extern char a; // extern variable must be declared before use print 
4     f("%c ", a); 
5     (void)msg(); 
6     return 0; 
7 }

程序的运行结果是:?A?Hello?
你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。?
如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有其他两个作用。?

?

? ? 3)示例:

? ? static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。

? ? 如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。

? ? 不妨做个小实验验证一下。

1 #include 
  
    2 int a; 3 int main(void) 4 { 5 int i; 6 static char str[10]; 7 printf("integer: %d; string: (begin)%s(end)", a, str); 8 return 0; 9 } 
  

? ?程序的运行结果如下?

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

?

面试题:static有什么作用?

答:在C语言中,static主要定义全局静态变量,定义局部静态变量,定义静态函数

?一、 ? ? ? 定义全局静态变量 :在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点:

(1)?????? 在全局数据区内分配内存

(2)?????? 如果没有初始化,其默认值为0

(3)?????? 该变量在本文件内从定义开始到文件结束可见

?二、 ? ? ? 定义局部静态变量:在局部静态变量前面加上关键字static,该局部变量便成了静态局部变量。静态局部变量有以下特点:

(1)?????? 该变量在全局数据区分配内存

(2)?????? 如果不显示初始化,那么将被隐式初始化为0

(3)?????? 它始终驻留在全局数据区,直到程序运行结束

(4)?????? 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

? 三、 ? ? ? 定义静态函数:在函数的返回类型加上static关键字,函数即被定义成静态函数。静态函数有以下特点:

(1)?????? 静态函数只能在本源文件中使用

(2)?????? 在文件作用域中声明的inline函数默认为static

? ? ? ? ? ? ? ? 说明:静态函数只是一个普通的全局函数,只不过受static限制,他只能在文件坐在的编译单位内使用,不能呢个在其他编译单位内使用。

在C++语言中新增了两种作用:定义静态数据成员或静态函数成员

(1)?????? 定义静态数据成员。静态数据成员有如下特点:

(1)?????? 内存分配:在程序的全局数据区分配

(2)?????? 初始化和定义:静态数据成员定义时要分配空间,所以不能在类声明中定义

(3)?????? 静态成员函数。静态成员函数与类相联系,不与类的对象相联系。静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例,主要用于对静态数据成员的操作。

(4) ? ? ? 静态成员函数和静态数据成员都没有this指针。

本文《static的作用》版权归qccqo所有,引用static的作用需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 【妙】bug称它为数组越界的妙用
    1、聊一聊首先跟大家推荐一首非常温柔的歌曲,跑步的常听。本文主要把自己对C语言中柔性数组、零数组等等的理解分享给大家,并聊聊如何构建一种统一化的学习思想 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • String字符串与字符数组#includeStringintmain(){char*strhello;字符串与字符数组的关系:字符串是 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇
    数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇,Go语言社区,Golang程序员人脉社 ... [详细]
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动 ... [详细]
  • 单片机入门指南:基础理论与实践
    本文介绍了单片机的基础知识及其应用。单片机是一种将微处理器(类似于CPU)、存储器(类似硬盘和内存)以及多种输入输出接口集成在一块硅片上的微型计算机系统。通过详细解析其内部结构和功能,帮助初学者快速掌握单片机的基本原理和实际操作方法。 ... [详细]
author-avatar
手机用户2502931713
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有