static函数与普通函数

2023-11-16

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。


C程序一直由下列部分组成:
      1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;    
  2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。    
  3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。     
  4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。      
  5)堆——动态存储分。

全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
   1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
   3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

好处:
定义全局静态变量的好处:
<1>不会被其他文件所访问,修改
<2>其他文件中可以使用相同名字的变量,不会发生冲突。

局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
  1)内存中的位置:静态存储区
  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
  3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

 注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

3. 静态函数
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
  函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
定义静态函数的好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突
<2> 静态函数不能被其他文件所用。
 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。 auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。
由于static变量的以上特性,可实现一些特定功能。
1. 统计次数功能
声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。

C语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。 
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。 

c语言中static的语义

1.static变量:

1).局部

a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。

b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。


2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。

2.static函数(也叫内部函数)

只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

static函数与普通函数 的相关文章

  • CCAnimation类 参考

    http www cocos2dchina com documentation interface c c animation html
  • 4.3.1 位置变化动作

    4 3 1 位置变化动作 2013 05 21 10 12 火烈鸟网络科技 人民邮电出版社 我要评论 0 字号 T T Cocos2d x高级开发教程 第4章动作 在这一章中 我们将为大家详细介绍各种动作的使用方法 读完本章后 读者将会学到
  • Box2D C++教程6-定制器(Fixtures)

    Box2D C 教程6 定制器 Fixtures 时间 2012 09 01 17 10 24 CSDN博客 原文 http blog csdn net wen294299195 article details 7932770 Box2D
  • Android studio的cMake编译生成.so库并调用

    第一步 添加工具 在SDK Tools中勾选安装CMake LLDB NDK 其中的LLDB是调试本地代码的工具 可以调试C 代码 第二步 创建一个最简单的官方demo File gt New gt NewProject 选中最下方的Inc
  • cocos自定义类 绑定到lua

    1 按照 frameworks cocos2d x tools tolua下的README mdown的指示一步一步做下去 务必要和文件中描述的一样 我已经被这个坑爹的东西坑的很惨了 检查这个有没有配置好的方法是 运行下那个genbindi
  • Cocos2d-x JSB 自动绑定bindings-generator (以下简称B-G) 使用心得

    文章转载自 http www cocoachina com bbs read php tid 177904 B G 是什么 当使用JSB的时候 如果你想要使用的C 的类或者方法没有在已有JSB中被绑定 这时候 就可以使用B G 它可以生成相
  • pvr 与 png 的内存占用

    原文链接 http blog sina com cn s blog 6fbe210701015j7z html Zwoptex 生成的 spritesheet 除了可以导出 png 格式的图片外还有 pvr 格式 pvr 格式是 iOS 的
  • android Intent启动flag

    android Intent启动flag 分类 android框架 2013 10 30 14 47 1318人阅读 评论 0 收藏 举报 FLAG GRANT READ URI PERMISSION 如果设置这个标记 Intent的接受者
  • cocos2d-x实例学习(8)之CCJumpTo和CCJumpBy

    CCJumpTo和CCJumpBy概念 CCJumpTo 把某一CCSprite跳到某一位置 CCJumpBy 把某一CCSprite跳起一段距离 它有一个方法reverse 它让对象按原路径返回 CCJumpTo和CCJumpBy示例 创
  • cocos2d-x 卡牌翻牌效果的实现

    cocos2d x 卡牌翻牌效果的实现 2012年07月25日 综合 共 3085字 字号 小 中 大 评论关闭 猴子原创 欢迎转载 转载请注明 转载自Cocos2D开发网 Cocos2Dev com 谢谢 原文地址 http www co
  • Cocos2dx-OpenGL ES2.0教程:编写自己的shader(2)

    在上篇文章中 我给大家介绍了如何在cocos2d x里面绘制一个三角形 当时我们使用的是cocos2d x引擎自带的shader和一些辅助函数 在本文中 我将演示一下如何编写自己的shader 同时 我们还会介绍VBO 顶点缓冲区对象 和V
  • cocos2dx 3.0 新建工程

    打开终端 转到cocos2d 3 0的这个目录下tools cocos2d console bin cocos py cocos py 运行命令 会显示该命令的帮助 根据帮助提示进行操作 有以下几个命令可用 compile Compiles
  • Cocos2D-x 3.0 中图元和精灵的 Z 索引不一致?

    我有两层 每个图层都有一个使用 OpenGL 进行的原始绘图 如下所示 void Layer1 drawPolygon glLineWidth 1 DrawPrimitives setDrawColor4B 255 255 255 255
  • Cocos2dx Android 构建错误:“arm-linux-androideabi-g++:没有这样的文件或目录”

    我下载了最新的cocos2dx 3 10 和NDK r11 我执行的时候出现以下错误cocos compile p android android studio Error AndroidDev android ndk r11 toolch
  • 如何使用 Marmalade 编译 Cocos2d-X?

    有谁知道教程 或者三个简单的步骤来编译我用 Cocos2d x 和 Marmalade 编写的代码 我想将我已经在 Cocos2d X 中编译和使用的代码插入到 marmalade 项目中 然后进行编译 很多地方都写得很简单 但我却很难做到
  • 设置 Cygwin + Android NDK + cocos2Dx 以与 Eclipse 配合使用

    我正在关注该网站的教程 通过游戏应用货币化 作者 Todd Perkins http www lynda com Android tutorials Understanding downloading Cocos2d x 107169 12
  • 嵌入式 cocos2d-js 应用程序可以回调 C++ 吗?

    我正在研究通过将 cocos2d js 作为视图嵌入现有 iOS 应用程序中来使用它的可能性 为了完成这项工作 我需要在 cocos2d 和周围的应用程序之间进行双向通信 经过一些初步调查 我确定可以致电in到 cocos 使用Script
  • Android 设备的后退和主页按钮按下事件 (cocos2d-x 3)

    我这样做是为了抓住Home and BackAndroid 设备上的按钮按下事件 被覆盖void Layer onKeyReleased EventKeyboard KeyCode keyCode Event event 像这样的函数 vo
  • cocos2d-x android 设置错误 - java.lang.NullPointerException

    我正在尝试设置适用于 Android 的 cocos2d x我跟着 我通过了终端的步骤 没有任何问题 setup py命令结果符合预期 我的问题是在我设置之后NDK ROOT in C C 构建 环境部分 我得到一些java lang Nu
  • Cocos2d-x:可以使用HTML(UIWebView)吗?

    我正在尝试cocos2d x现在我可以为 Android 构建 Javascript 示例并在浏览器中运行它们 现在我想创建自己的游戏 但由于有 HTML 背景 我宁愿使用 HTML 标签和 CSS 也不愿使用 Javascript 来设置

随机推荐

  • 2020国内十大API接口服务平台

    API的概念早在上世纪60年代就已经出现 其代表的是应用程序的编程接口 是一些预先定义的函数 或指软件系统不同组成部分衔接的约定 换句话说 API是一个信使 它将用户的请求交付给用户所请求的提供者 然后将响应交付给用户 打个简单的比喻 日常
  • 【CVPR2023 Best Paper】Planning-oriented Autonomous Driving 阅读笔记

    Paper https openaccess thecvf com content CVPR2023 papers Hu Planning Oriented Autonomous Driving CVPR 2023 paper pdf Gi
  • 链圈的朋友们值得收藏!腾讯首席架构师教你两种区块链设计思路

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由敖萌发表于云 社区专栏 区块链发展到了现在 产生了很多不同形式的区块链技术 随着技术的发展 目前比较公认的看法是区块链已经走进了2 0时代 区块链1 0是以比特币为代表的去中心
  • 文件编码格式

    大家可能都知道文件编码格式 如gbk格式 ansi格式 字符以1byte编码 中文字符以2字节编码 unicode格式无论是字符还是中文字符都以2字节统一编码 utf 8格式则是可变长编码 不同编码格式的文件都有开头相应的字符标记来标识 如
  • pikachu靶场搭建教程(以物理主机访问虚拟机为例)

    1 提前下载好所需软件 pikachu phpstudy 服务器集成软件 2 在虚拟机上完成phpstudy的安装 并将下载好的pikachu文件夹放置于phpstudy的根目录下 例如我的是C phpstudy phpstudy pro
  • Keras学习:06.LSTM和双向LSTM讲解及实践

    本文主要介绍了LSTM与双向LSTM网路的原理和具体代码实现 长短期记忆 Long Short Term Memory LSTM 也是一种时间递归神经网络 最早由 Hochreiter Schmidhuber 在1997年提出 设计初衷是希
  • (附源码)计算机毕业设计ssm大学生心理健康管理系统

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • Acwing 826. 单链表 (用数组模拟单链表)

    实现一个单链表 链表初始为空 支持三种操作 1 向链表头插入一个数 2 删除第k个插入的数后面的数 3 在第k个插入的数后插入一个数 现在要对该链表进行M次操作 进行完所有操作后 从头到尾输出整个链表 注意 题目中第k个插入的数并不是指当前
  • Remix连接本地&遇到的问题

    Remix连接本地 遇到的问题 前提条件 安装node node版本不要太低 最好14 1 安装remix npm install g remix project remixd 2 建立remix与本地文件连接 remixd s 具体文件项
  • 目标检测简介

    目标检测是一种与计算机视觉和图像处理相关的计算机技术 用于检测数字图像和视频中某一类语义对象 如人 建筑物或汽车 的实例 目标检测的研究领域包括多类别检测 边缘检测 突出目标检测 姿势检测 场景文本检测 人脸检测 行人检测等 目标检测作为场
  • C#基于LINQ对数据库的增删查改

    1 增加功能 主窗口 using System using System Collections Generic using System ComponentModel using System Data using System Draw
  • Unity 语法详解之查找游戏物体的方法(含查找隐藏物体)

    为了更好的看懂 有一个非常基础的知识 如果不知道可以移步去了解一下哦 unity gameobject和transform的区别和关联通俗解释 gameobject transform 菌菌巧乐兹的博客 CSDN博客 一 前情提要 大写的G
  • CF1512C A-B Palindrome 题解

    题目大意 给定一个字符串 长度为 a b a b a b 给定 a a a
  • 抽象方法 ——动物类的继承。

    package TcmStudy day25 abstract class Animal 抽象类 1 不能创建对象 抽象方法 没有实体 必须子类重写它 目的是为了子类完成规定动作的 起到模板的作用 子类没有重写 会报错 public abs
  • vue如何让el-breadcrumb面包屑导航栏根据路由跳转地址动态切换标题内容

    Vue如何让el breadcrumb面包屑导航栏根据路由跳转地址动态切换标题内容 废话少说 先上效果图 其实想要实现图片上的效果非常简单 我们直接使用路由元信息即可解决 关于路由元信息的解答vue router上面的开发文档写的非常详细
  • python中全部注释_Python中的注释

    1 1 注释的目的 通过用自己熟悉的语言 在程序中对某些代码进行标注说明 这就是注释的作用 能够大大增强程序的可读性 1 2 注释的分类 1 2 1 单行注释 以 开头 右边的所有东西当做说明 而不是真正要执行的程序 起辅助说明作用 我是注
  • 管道

    p The hero s birthday is birthday date format uppercase p
  • CentOS 8安装postgresql 13

    安装postgresql 登陆网址 https www postgresql org download linux redhat 选择postgresql版本和操作系统平台等信息 直接复制命令 依次执行 Install the reposi
  • ZK相关(转载)

    Paxos算法 https www douban com note 208430424 zAB https blog csdn net junchenbb0430 article details 77583955 utm medium di
  • static函数与普通函数

    全局变量 外部变量 的说明之前再冠以static 就构成了静态的全局变量 全局变量本身就是静态存储方式 静态全局变量当然也是静态存储方式 这两者在存储方式上并无不同 这两者的区别虽在于非静态全局变量的作用域是整个源程序 当一个源程序由多个源