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

article/2025/11/5 13:35:00

C语言:static作用(修饰函数、局部变量、全局变量)

一、 static全局变量与普通的全局变量有什么区别 ?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
  全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
  这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
  static全局变量只初使化一次,防止在其他文件单元中被引用;
二、static局部变量和普通局部变量有什么区别 ?
  把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。  
       static局部变量只被初始化一次,下一次依据上一次结果值;
三、static函数与普通函数有什么区别?
static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
四、static的三条重要作用,首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
       1、隐藏
          1.1当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是static_extern.c,另一个是static_main.c。
          1.2static_main.c

    #include<stdio.h>
     
    void main(void)
    {
        extern char i;    // extern variable must be declared before use
        printf("%c ", i);
        msg();
        return 0;
    }

          1.3static_extern.c

    char i = 'A'; // global variable
    void msg()
    {
        printf("I Love Beijing!I Love hanyue!\n");
    }

        1.4编译&执行

       1.5你可能会问:为什么在static_extern.c中定义的全局变量i和函数msg能在static_main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,i是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件static_main.c是可见的。如果加了static,就会对其它源文件隐藏。例如在i和msg的定义前加上static,static_main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。
 
     2、static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。
       2.1 static_main.c

    #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;
    }

     2.2编译&执行

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

    #include <stdio.h>
     
    int a;
     
    int main(void)
    {
        int i;
        static char str[10];
     
        printf("integer: %d;  string: (begin)%s(end)\n", a, str);
     
        return 0;
    }

     2.2编译&执行

 

 

 


http://chatgpt.dhexx.cn/article/nY266YVU.shtml

相关文章

数据链路层协议 ——— 以太网协议

文章目录 链路层解决的问题以太网协议认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMUT对IP协议的影响MTU对UDP协议的影响MTU对TCP协议的影响数据跨网络传输的过程 ARP协议ARP协议的作用ARP数据的格式ARP协议的工作流程 链路层解决的问题 IP拥有将数据跨网…

DNS详解

前言&#xff1a; 前面讲了域名、IP&#xff0c;那么还缺少一个主角—DNS。这些都是网络中最最最基础的&#xff0c;也是最重要的概念&#xff0c;很有必要深入学习下。 网站打开的原理 我们在通过网站网址打开网站的过程中&#xff0c;其实就是浏览器获取到了隐藏在网址背后的…

一文读懂物联网 MQTT 协议之实战篇

一、前言 上一篇我们介绍了 MQTT 协议格式以及相关的特性&#xff1a;一文读懂物联网 MQTT 协议之基础特性篇&#xff0c;这一篇我们就来实战一番&#xff0c;理论得与实践结合&#xff0c;方能吃透 MQTT。 我的那个读者还提到了讲一下 Mosquitto&#xff0c;这是一款开源消息…

基于光流传感器定位和导航的自主飞行无人机

基于光流传感器定位和导航的自主飞行无人机 An Autonomous UAV with an Optical Flow Sensor for Positioning and Navigation 注&#xff1a;翻译水平有限&#xff0c;错误之处&#xff0c;敬请指正&#xff01; 原文链接&#xff1a;http://cdn.intechopen.com/pdfs/45731.p…

Kubernetes NetworkPolicy:打造更安全的容器运行环境

常见的应用可以分为两大类&#xff1a;Job和Service。Job比较简单&#xff0c;就是一个普通的任务&#xff0c;完成之后就退出&#xff0c;一般不需要暴露对外服务的网络监听端口。Service是指长期运行的进程&#xff0c;监听某个网络端口&#xff0c;其他服务可以通过网络连过…

Drupal远程代码执行漏洞(CVE-2018-7600)

目录 一. 漏洞原理 二. 影响版本 三. 漏洞环境搭建 四. 漏洞复现 一. 漏洞原理 Drupal是一个开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;全球超过100万个网站&#xff08;包括政府&#xff0c;电子零售&#xff0c;企业组织&#xff0c;金融机构等&#xff0…

记一次从盲SSRF到RCE

公粽号&#xff1a;黒掌 一个专注于分享网络安全、黑客圈热点、黑客工具技术区博主&#xff01; 一 前言 发现此漏洞的漏洞赏金计划不允许公开披露&#xff0c;因此我不会直接使用涉及的系统名称。该项目是发布在Hackerone时间最长漏洞奖金最大的项目之一, Hackerone上有很多关…

002.光流传感器(ADNS0380版)使用说明

先放广告&#xff0c;以下是光流传感器购买地址&#xff08;全网最低价并且唯一提供代码支持的&#xff09;&#xff1a; https://item.taobao.com/item.htm?spma230r.1.14.63.j2eDn3&id541014211123&ns1&abbucket12#detail 如果模块直接使用在APM飞控上请看下文标…

003.关于光流传感器(ADNS3080)调焦问题

关于光流传感器使用官方网址如下&#xff1a; http://ardupilot.org/copter/docs/common-mouse-based-optical-flow-sensor-adns3080.html 微信公众号&#xff1a;嵌入式大玩家 更多精彩文章我将第一时间在微信公众号里面分享&#xff0c;如果不想错过,可以关注我的微信公众号。…

腾讯笔试题——逆序对

这题花了我非常多时间&#xff0c;ac率从10&#xff05; --> 50&#xff05; --> 60&#xff05; --> 70&#xff05; --> 80&#xff05; --> 100&#xff05; &#xff0c;被这题疯狂支配几个小时&#xff01; 最关键没有详细的题解可以参考&#xff0c;大数据…

2020秋招腾讯后台笔试题(一)

点击上方蓝字设为星标 下面开始今天的学习&#xff5e; 这是2020届腾讯秋招的笔试题&#xff0c;其实就是19年九月份的题目&#xff0c;总共五道题&#xff0c;这篇文章写说两道题&#xff0c;都是有关于栈的应用的 01 压缩算法 小Q想要给他的朋友发送一个神秘字符串&#xff0…

腾讯笔试-1

1、什么是运维&#xff1f;什么是游戏运维&#xff1f;1&#xff09;运维是指大型组织已经建立好的网络软硬件的维护&#xff0c;就是要保证业务的上线与运作的正常&#xff0c;在他运转的过程中&#xff0c;对他进行维护&#xff0c;他集合了网络、系统、数据库、开发、安全、…

腾讯 C++ 笔试/面试题及答案

星标/置顶 公众号&#x1f447;&#xff0c;硬核文章第一时间送达&#xff01; 链接 | https://zhuanlan.zhihu.com/p/274473971 题很多&#xff0c;先上题后上答案&#xff0c;便于大家思考 问题点&#xff1a; 1、C和C的特点与区别&#xff1f; 2、C的多态 3、虚函数实现 4、…

腾讯2020校园招聘笔试

输入1&#xff1a; 2 2 1 1 1 1 输出1&#xff1a; 0 输入2&#xff1a; 2 2 1 2 2 1 输出2&#xff1a; 2 import java.util.Scanner; public class Main { public static void main(String[] args) {// TODO Auto-generated method stubScanner scnew Scanner(Syste…

腾讯笔试题20210321

一、链表树 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言 2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言 524288K 64bit IO Format: %lld 题目描述 在牛牛所在的世界&#xff0c;链表是一种二叉树。 这是牛牛第一次见到链表树&#xff0c;他感到十分好奇&a…

腾讯2021批笔试题解

总结&#xff1a;一套算是正常的笔试…算是让大家有点思考了…都没那么一眼秒&#xff08;除了强烈谴责某T5最短路板子。我还差点没看到这题hhh&#xff08;&#xff08; &#xff08;另一套题的T5&#xff09; T5 题目大意&#xff1a;给出n个红球&#xff0c;n个黑球&#x…

腾讯笔试题精选一

1.32位机上根据下面的代码&#xff0c;问哪些说法是正确的&#xff1f;&#xff08;&#xff09; signed char a 0xe0 unsigned int b a; unsigned char c a; A. a>0 && c>0 为真 B.a c 为真 C.b的十六进制表示是&#xff1a;0xfffffe0 D.上面都不对 sig…

腾讯笔试题_20220424

前言 笔试一共五道编程题&#xff0c;满分是100分&#xff0c;时间是两个小时&#xff0c;可以跳题&#xff0c;使用的平台是牛客网&#xff0c;允许跳出界面使用本地IDE。 题目一&#xff1a;构建数字 给定n个长度均为m的数字字符串&#xff0c;从上往下构建成m个新的数&am…

笔试面试(1)腾讯2014校园招聘软件开发类笔试试题

把基本经典的书籍认真看看,那些笔试面试的都不是什么问题。但是,专门的突击和训练还是很有必要的。 好的offer是可以通过充分的准备刷到的。 我们就从各大公司的套题开始刷起吧,中间再穿插一些专题。 今天先看看腾讯的2014年校招的软开笔试题。 考试时长:120分钟 一 不定项…

腾讯近三年软件测试工程师面试笔试题目精选(包含答案)

目录 1、什么是兼容性测试?兼容性测试侧重哪些方面? 2、我现在有个程序&#xff0c;发现在 Windows 上运行得很慢&#xff0c;怎么判别是程序存在问题 还是软硬件系统存在问题? 3、测试的策略有哪些? 4、正交表测试用例设计方法的特点是什么? 5、描述使用 bugzilla 缺…