static的作用

static的作用

在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。

(1)先来介绍它的第一条也是最重要的一条:隐藏。

当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。

下面是a.c的内容

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

下面是main.c的内容

int main(void)
{    
    extern char a;    // extern variable must be declared before use
    printf("%c ", a);
    (void)msg();
    return 0;
}
 

程序的运行结果是:

A Hello

你可能会问:为什么在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还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。
#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;
}
 

程序的运行结果是:

global          local static

1               10

2               9

3               8

4               7

5               6

6               5

7               4

8               3

9               2

10              1

 

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

#include <stdio.h>

int a;

int main(void)
{
    int i;
    static char str[10];

    printf("integer: %d;  string: (begin)%s(end)", a, str);

    return 0;
}
程序的运行结果如下

integer: 0; string: (begin)(end)

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

转载于:https://www.cnblogs.com/foundwant/archive/2012/10/28/2743163.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一道算法题跟大家分享

无意中看到一道算法题&#xff0c;拿出我的解法与大家分享。 题目&#xff1a;输出1,2,3,4四个数字能组成的互不相同且无重复的三位数并统计满足条件的三位数个数 大家先想想&#xff0c;再看答案吧。 View Code 1 /// <summary>2 /// 计算1,2,3,4产生的组成互…

docker php示例,Docker PHP 例子

docker可以执行任何应用程序。本章我们将创建一个Php应用&#xff0c;并使用docker运行它。1. 创建项目目录我们会把这个项目的相关文件&#xff0c;集中放到一个目录docker-php&#xff1a;[rootqikegu demo]# mkdir docker-php2. 创建PHP文件在docker-php目录下&#xff0c;创…

php gzip 关闭,Thinkphp 关闭Gzip header输出问题

Thinkphp默认开启gzip压缩OUTPUT_ENCODE > true, // 页面压缩输出需求是这样的在一个Action里面&#xff0c;用header输出一个图片问题由于thinkphp使用了Ob_start// 页面压缩输出支持 if(C(OUTPUT_ENCODE)){ $zlib ini_get(zlib.output_compression); if(empty($zlib)) ob…

NSTimer 与 Run loop Modes

一.NSRunLoop 在Cocoa中&#xff0c;每个线程(NSThread)对象中内部都有一个run loop&#xff08;NSRunLoop&#xff09;对象用来循环处理输入事件&#xff0c;处理的事件包括两类&#xff0c;一是来自Input sources的异步事件&#xff0c;一是来自Timer sources的同步事件;run …

游戏软件提示d3dcompiler_43.dll的五个解决方法,亲测靠谱

在使用电脑进行工作&#xff0c;玩游戏的时候&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“D3DCompiler_43.dll丢失”的提示。D3DCompiler_43.dll是一个非常重要的动态链接库文件。它是由DirectX SDK提供的&#xff0c;用于编译和优化DirectX着色器代码的…

php需要掌握什么,php专业需要掌握哪些知识

网站我们分为前端、后端&#xff0c;组成在一起就可以搭建一套独立的网站。在招聘职位中&#xff0c;前端和后端是分开来招聘的&#xff0c;有前端设计师&#xff0c;PHP后端工程师。如果你能独立完成一个网站&#xff0c;那就是全栈工程师了。好了&#xff0c;让我们来看看搭建…

JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download

JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/downloadJDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download - Lau Ben - ITeye技术网站 JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download 博客分类&#xff1a; java.netJavaJDKWindowsHTMLJ…

owncloud nginx php,nginx配置owncloud记录。

开始配置时忘看php-fpm配置结果这里 server unix:/dev/shm/php-cgi.sock; 一直502&#xff0c;后面加上了错误日志输出&#xff0c;才发现问题。upstream php-handler {server unix:/dev/shm/php-cgi.sock; ##开始没注意这里&#xff0c;一直502# Depending on your used PHP v…

前端学习(582):实现观看和调试dom节点

1双击编辑修改 2修改dom 右击edit as html 3复制粘贴

php解析html数组,HTML中如何处理PHP传递的三维数组

需求描述&#xff1a;从 PHP 拿过来一组三维数组&#xff0c;现在想要通过 JQ/JS 获取里面数据。如何在页面中正确获取 {$layer} 的数组(不需要显示)&#xff1f;JQ/JS 分别获取数据&#xff1f;HTMLprint_r($layer);打印结果Array([id] > 2387[image] > /Public/upload/…

无法打开用户默认数据库,登录失败,用户‘sa’登录失败,错误:4064的解决方法...

无法打开用户默认数据库&#xff0c;登录失败&#xff0c;这是因为登录帐户的默认数据库被删除。解决方案&#xff1a;用windows身份模式进入&#xff0c;选择“安全性”---"登录名"------“HRKJ”&#xff0c;在HRKJ上右击&#xff0c;弹出如图窗口&#xff0c;找到…

php deprecated,解决php中each函数在7.2版本提示deprecated错误问题

今天有个thinkphp5.0版本的项目切换到php7.2版本&#xff0c;有个页面一直报错&#xff0c;打开调试代码。发现错误提示“The each() function is deprecated. This message will be suppressed on further calls”。说明php不建议继续使用each函数了&#xff0c;那如何修改代码…

前端学习(584):在dom中调试节点

第一种方式 修改完成 第二种 删除标签 执行 第三种 执行 删除

asp.net调用百度地图API,实现电子地图

http://openapi.baidu.com/map/index.html 例子&#xff1a; <% Page Language"C#" AutoEventWireup"true" CodeFile"Default2.aspx.cs" Inherits"Default2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti…

php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用

一.场景介绍最近的一个项目需要用到发布/订阅的信息系统&#xff0c;以做到最新实时消息的通知。经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低。二.什么是redis pub/sub资料查看大家在看我的blog的同时可以打开redis…