栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言】关键字static详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言】关键字static详解

概述

一、对 static的基本了解

1. 静态局部变量

2. 静态全局变量

3. 静态函数

二、深入系统了解 static 存储类型

1. static 与变量

2. static 与函数

三、使用static有何意义

相关概念的补充

一. 存储类说明符

二、C 中的变量的存储区

三、链接属性

概述

    static 是 C 语言中一种存储类说明符,其基本用法主要有两种:一是修饰变量,二是修饰函数。但仅从字面意思去理解 static,是远远不够的,static 还有其更深层次的意义,恰当使用static不仅有利于程序的安全性和可维护性,同时也是一种良好的代码风格。

    (ps: 蓝字涉及到的相关概念在文章后有补充)

一、对 static的基本了解

1. 静态局部变量

    首先来明确普通局部变量的一些性质:

    1. 普通局部变量被存储在内存区的栈空间或堆空间(动态分配)上。

    2. 普通局部变量的作用域在定义该变量的函数或者复合语句内部。

    3. 普通局部变量的生命周期是临时的。

    4. 未经初始化的普通局部变量的值是随机的。

    static 作为储存类说明符修饰局部变量,本质上是改变了变量的储存类型,正因为此,变量的性质发生了一系列的改变。

    1. 静态局部变量被存储在数据区的静态存储区(也称 data 段)。

    2. 静态局部变量的作用域不改变。

    3. 静态局部变量的生命周期是整个程序的执行过程。所以当程序走出定义该静态局部变量的函数时,变量并没有被销毁而一直存在,直到再次调用该函数,因此静态局部变量在程序执行声明该变量时被首次初始化,以后的函数调用不再进行初始化,也有人称作静态局部变量只进行一次初始化。

    4. 未经初始化的静态局部变量会自动初始化为 0。

2. 静态全局变量

    先来重新认识一下普通全局变量的相关性质:

    1. 普通全局变量被存储在数据区的 bss 段或 data 段。

    2. 普通全局变量的作用域是整个程序,既可在本文件中调用,也可在其他文件中调用。

这里又涉及到了变量的链接属性,普通全局变量的链接属性为外部链接。

    3. 普通全局变量的生命周期是整个程序执行过程。

    对于静态全局变量,static 不仅改变了变量的存储类型,还调整了其链接属性。

    1.静态全局变量被存储在数据区的 静态存储区(data段)。

    1. 静态全局变量链接属性变为内部链接,作用域因此被限制在本文件,变量只可在本文件中被访问,其他文件可定义同名变量而不会引起冲突。

    2. 未经初始化的静态全局变量会自动初始化为 0 。

3. 静态函数

    与静态全局变量相似,静态函数为内部链接,只能在声明它的文件中被调用,其他文件可以定义同名函数而不会引起冲突。

二、深入系统了解 static 存储类型

    C程序中每个变量都有三个属性:存储期限、作用域和链接属性,而这三个属性都依赖于变量声明的位置,即变量的存储类型。

    C程序中变量的存储类型有auto,static,extern和 register 四种,而函数的存储类型却只有static 和extern 两种,这就引起了我们对于static变量和 static 函数的讨论。

1. static 与变量

    static 存储类型可以用于全部变量,但是用于块外部声明和块内部声明会有不同的效果。

    当用于块外部声明变量时,static 会将变量变为内部链接属性。

    当用于块内部声明变量时,static 会将变量变为静态存储期限。

    static 在保持变量原有的属性的同时,通过以上规则对一些属性进行了更改,这就是static 修饰局部变量和全局变量最根本的区别。

2. static 与函数

        static 修饰函数,说明函数为内部链接;对应extern 修饰函数,说明函数为外部链接。

三、使用static有何意义

1. static 修饰全局变量与函数,实际改变了原有链接属性,使得全局变量与函数被隐藏在本文件,只能在本文件中访问。解决了不同源文件中函数名、变量名冲突的问题,有效降低了程序模块之间的耦合,

2.  static 修饰局部变量,本质是将变量的存储区域改至静态存储区,从而延长了变量的生命周期,程序在走出函数时变量并没有被销毁,直到下次调用函数,变量依然保持原值,并且不再被初始化;从另一方面来看,这本身也是一种隐藏,将变量隐藏在函数中,变量只能在函数中访问,却存在于整个程序。

3. static 修饰变量还有一特点,当变量未初始化时,默认初始化为 0。这是因为在静态存储区,所有内存都被默认置为 0,有时这一特点可减少工作量。

相关概念的补充

一. 存储类说明符

    存储类说明符用于指定变量或函数的存储类型,不同存储类型的变量或函数具有不同的性质,C语言中存储类说明符有auto,static,extern和 register 。

二、C 中的变量的存储区
栈区编译器自动分配释放              
堆区主动申请分配内存                  由动态内存分配函数申请
数据区

.bss段                                     存放程序中未初始化的全局变量

.rodata段(常量存储区)            存放的是常量

.data段(静态存储区)               存放初始化的全局变量和静态变量

代码区.text段

静态变量被放在静态存储区,存储期限(生命周期)为整个程序的执行过程。

三、链接属性

    C语言的链接属性决定变量或函数能否在其他文件中访问。

    链接属性有三种,外部链接、内部链接和无连接。

    外部链接:在文件外部进行链接,即可以跨文件访问变量或函数。

    内部链接:在文件内部进行链接,只可以在本文件中访问。

    无连接:不参与链接,一般为局部变量,在其作用域内可访问。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346683.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号