C语言中auto,register,extern,static【转】

***************************************************

更多精彩,欢迎进入:http://shop115376623.taobao.com

***************************************************


 语言中提供了存储说明符auto,register,extern,static说明的四种存储类别。四种存储类别说明符有两种存储期:自动存储期和静态存储期。

其中autoregister对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销

关键字externstatic用来说明具有静态存储期的变量和函数。用static声明的局部变量只能被定义该变量的函数所识别,但是不同于自动变量的是,static变量在其函数被调用退出后,仍保留其值。下次函数被调用时,可以访问最近一次被修改后的值。static变量的声明方法如下:

static       int    si = 1;

由于static的以上特性,可以实现一些特定的功能。下面说明常见的两种用途。

1. 统计函数被调用的次数

声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。测试代码如下:

/*--------------------------------------------------------------------------------

              s_fun.c

              to count the number of a function's being called, use static var.

*/

#include <stdio.h>

int   fun_1(int);

int main()

{

       int i;

       for (i = 1; i <= 5; i++)

              fun_1(i);

       return 0;

}

int fun_1(int x)

{

       static count = 0;

       

       count++;

       printf("I have been called %d times.\n", count);

       

       return 2*x;

}

输出结果为:

I have been called 1 times.

I have been called 2 times.

I have been called 3 times.

I have been called 4 times.

I have been called 5 times.

2. 减少局部数组建立和赋值的开销

变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销。示例代码如下:

/*--------------------------------------------------------------

       array_1.c

       to test static array

*/

#include <stdio.h>

#include <time.h>

#include <string.h>

#define ARRAY_SIZE 10000

#define CALL_TIMES   30000

int fun_1();

int fun_2();

int main()

{

       int i;

       char string2[10], *string3;

       time_t     t;

       

       time(&t);

       string3 = ctime(&t);

       printf("time 1: %s", string3);

       

       for (i = 1; i <= CALL_TIMES; i++)

       {

              fun_1();  

       }

       

       time(&t);

       string3 = ctime(&t);

       printf("time 2: %s", string3);

       

       for (i = 1; i <= CALL_TIMES; i++)

       {

              fun_2();  

       }

       

       time(&t);

       string3 = ctime(&t);

       printf("time 3: %s", string3);

       

       return 0;

}

int fun_1()

{

       int a[ARRAY_SIZE], b[ARRAY_SIZE];

       int i, t;

       

       for ( i = 0; i < ARRAY_SIZE; i++)

       {

              a[i] = i;

              b[i] = ARRAY_SIZE - i;

       }

              

       for ( i = 0; i < ARRAY_SIZE; i++)

       {

              t = a[i];

              a[i] = b[i];

              b[i] = t;

       }

       

       return 0;

}

int fun_2()

{

       static int a[ARRAY_SIZE], b[ARRAY_SIZE];

       int i, t;

       

       for ( i = 0; i < ARRAY_SIZE; i++)

       {

              a[i] = i;

              b[i] = ARRAY_SIZE - i;

       }

              

       for ( i = 0; i < ARRAY_SIZE; i++)

       {

              t = a[i];

              a[i] = b[i];

              b[i] = t;

       }

       

       return 0;

}

经过多次运行后,典型的几次结果如下:

C语言中auto,register,extern,static【转】 - yanpol - yanpol的博客

实验环境:

PC:Intel C 2.4D, 256M DDR333, 80G 7200RPM

OS:win XP professional, SP2

Compiler: TC 2.0

Reference:

1.H. M. Deitel, P. J. Deitel, C How To Program. 1994, Prentice Hall. 2002, China Mechine Press.

C语言中auto,register,extern,static【转】 - yanpol - yanpol的博客 
C语言之extern声明辨析

1 基本解释

extern可以置于变量或者函数前(说明该变量或函数定义在别处)以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

另外,extern也可用来进行链接指定。

2 问题:extern 变量

在一个源文件里定义了一个数组:

char a[6];

在另外一个文件里用下列语句进行了声明:

extern char *a;

请问,这样可以吗?

答案与分析:

1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。

2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x61626364 (abcd的ASCII码值),*a显然没有意义,如下图:

a[] = "abcd"
语句
a=0x61626364
0x61
内存地址
0x61626364
0x62
0x63
0x64

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

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

相关文章

SEO的十种赚钱方式

我深深的想要通过的自己的SEO技术赚钱。其实&#xff0c;掌握一门技术是次要方面&#xff0c;学会把技术变现才是重中之重&#xff0c;所以你说学习SEO重要吗?挺重要&#xff0c;但绝不是最重要的。学SEO的赚钱方式才是最重要的。那么SEO都有哪些赚钱方式呢?我罗列了十种赚钱…

Compile a native C Android application

2019独角兽企业重金招聘Python工程师标准>>> http://www.cnblogs.com/GoAhead/p/4186707.html 通过上网搜索&#xff0c;你可以发现很多种编译Android native应用的方法&#xff0e;我想说的是&#xff0c;不同的控制台应用, 守护程序(daemon), C/C库&#xff0c;等…

J2SE核心实战开发—— 集合类框架

文档都是基于 实验楼 线上环境制作的&#xff0c;因此文档叙述和截图均与其有关。使用其他实验环境也没有太大影响&#xff0c;知识点的操作是类似的。该系列的课程是在 实验楼 实习所原创的第一个课程&#xff0c;欢迎大家多提意见。 一、实验简介 在Java基础语法中&#xff0…

猫和老鼠java下载安装_tomcat(Java服务器)

Tomcat(Java服务器工具)是一款十分优质的Java服务器软件。在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。对于一个初学者来说&#xff0c;可以这样认为&#xff0c;当在一台机器上配置好Apache 服务器&#xff0c;可利用它响应…

管道通信

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 什么是管道&#xff1f; 管道是单向的、先进先出的&#xff0c;它把一个进程的输出和另…

Linux 终端下 dstat 监控工具

dstat 是一个可以取代vmstat&#xff0c;iostat&#xff0c;netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些另外的功能&#xff0c;增加了监控项&#xff0c;也变得更灵活了。dstat可以很方便监控系统运行状况并用于基准测试和排除故障。dstat可…

运用HTML5+CSS3和CSS滤镜做的精美的登录界面

原始出处http://chenjinfei.blog.51cto.com/2965201/774865<!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312"> <meta http-equiv"description" content"运用C…

MyEclipse使用总结——MyEclipse文件查找技巧 ctrl+shift+R ctrl+H

一、查找文件 使用快捷键【ctrlshiftR】弹出弹出文件查找框&#xff0c;如下图所示&#xff1a; 二、查找包含某个字符串的文件 使用快捷键【ctrlH】在弹出对话框中选File Search选项&#xff0c;然后在第一个文本框中粘贴&#xff08;我一般用粘贴&#xff09;或自已手动录入&…

java实现控件绑定数据源_控件(三)——TreeView控件以XmlDataSource控件为数据源实现简单的绑定...

TreeView控件功能非常强大&#xff0c;今天&#xff0c;我们只是窥其一角。我们实现的例子是&#xff1a;TreeView控件与XmlDataSource控件绑定&#xff0c;然后在网页显示选中项。首先我们添加一个xml&#xff0c;取名为tv.xml。在其中写上如下代码&#xff1a;这时我们在defa…

手机屏幕原理和设计(触摸屏幕)

//本文参考了很多百度百科的知识  随着android手机的流行&#xff0c;手机触摸屏成为一个时尚。再购机的时候&#xff0c;就会有很多人去问手机的触屏是电阻式的还是电容式的呢&#xff1f;但是其实很多人应该是不知道个中的原委的。只是一个感觉电容式的一定要比电阻式的好。…

extjs5(05--主界面上加入顶部和底部区域)

这一节为主界面加一个顶部区域和底部区域。一个管理系统的界面可以粗分为顶部标题部分、中间数据展示和处理的部分、底部备注和状态部分。 在增加这二个区域之前&#xff0c;我们先在MainModel.js中加入一些数据。 1 Ext.define(app.view.main.MainModel, {2 extend: Ext.a…

java mongo 查询数组_MongoDB查询(数组、内嵌文档)

一、简介我们上一篇介绍了db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段&#xff0c;我们今天介绍了对数组和内嵌文档的查询操作&#xff0c;尤其是对$elemMatch 同样可以用在find方法的第二个参数来限制返回数组…

手机触摸屏的分类和原理,供大家选择手机时用

转载自&#xff1a;http://www.51testing.com/?uid-144635-action-viewspace-itemid-216296 必大家很关心的一个问题就是手机的触摸屏寿命是多少吧&#xff01;还有就是到底是电阻式触摸屏&#xff08;诺基亚的&#xff09;好还是电容式触摸屏&#xff08;iPhone等&#xff09…

Actionbarsherlock Demo 浅析 :Overlay

让Actionbar处于覆盖模式&#xff0c;当Activity需要显示大量滚动的内容&#xff0c;尤其是包含图片内容的时候&#xff0c;Overlay模式非常有效。 requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);//将Actionbar设置为Overlay模式。 getSupportActionBar().setBackg…

浅析C#中构建多线程应用程序

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 引言 1.理解多线程 2. 线程异步与线程同步 3.创建多线程应用程序 3.1通过System.Threa…

58同城高性能移动Push推送平台架构演进之路

2019独角兽企业重金招聘Python工程师标准>>> 本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段&#xff0c;并介绍了什么是移动Push推送&#xff0c;为什么需要&#xff0c;原理和方案对比&#xff1b;移动Push推送第一阶段&#xff08;单平台&#xff…

java不规则算法_分布式id生成算法 snowflake 详解

背景在复杂分布式系统中&#xff0c;往往需要对大量的数据和消息进行唯一标识。如在支付流水号、订单号等&#xff0c;随者业务数据日渐增长&#xff0c;对数据分库分表后需要有一个唯一ID来标识一条数据或消息&#xff0c;数据库的自增ID显然不能满足需求&#xff0c;此时一个…

Android中下载、安装和卸载(原)

应用场景&#xff1a;在检查版本更新的时候经常需要从服务器端下载然后安装到手机中 使用工具&#xff1a; XUtils&#xff0c;这个开源的框架真的是需要花大把时间去阅读和理解的&#xff0c;十分有用的&#xff0c;on the way &#xff01; fighting&#xff01; 下载&#x…

python对文件进行读写操作

2019独角兽企业重金招聘Python工程师标准>>> python进行文件读写的函数是open或file file_handler open(filename,,mode&#xff09; Table mode 模式描述r以读方式打开文件&#xff0c;可读取文件信息。w以写方式打开文件&#xff0c;可向文件写入信息。如文件存在…

[转]VisualStudio如何组织解决方案的目录结构

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 解决方案与项目&#xff1a; 从VC6之后VC系列就使用解决方案&#xff08;Solution&…