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,一经查实,立即删除!

相关文章

Oracle if else if for case

------------------游标forif else if DECLARE cursor s_cursor is SELECT * from emp;--定义游标 beginfor r in s_cursor loop--循环if r.deptno10--if判断then dbms_output.put_line(名字:||r.ename||sal||r.sal);else if r.deptno20then dbms_output.put_line(名字:||r.ena…

java汉字转化accic_Java自主学习贴

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼2019-08-25链表学习续实现数据内容查询功能interface ILink{//创建一个接口用于定义方法标准//定义增加方法public void add(E e) ;//定义获取元素个数方法public int getLength();//判断是否为空集合public boolean isEmpty();//定…

SEO的十种赚钱方式

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

sizeof详解

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** sizeof&#xff08;&#xff09;功能&#xff1a;计算数据空间的字节数 #include<…

关于C/C++中的“auto”关键字

C/C 98标准 C03标准 早在C98标准中就存在了auto关键字&#xff0c;那时的auto用于声明变量为自动变量&#xff0c;自动变量意为拥有自动的生命期。此用法是多余的&#xff0c;因为即使定义变量时不加"auto"&#xff0c;变量也会有自动的生命期。用法如下&#xff1a;…

学java的人都是什么性格_什么样的人适合学习Java编程

展开全部下面咱们说一下Java更适合那些人群第一种&#xff0c;理工科专业。如果你大学时学的是理工科专业&#xff0c;对Java有一定的了解&#xff0c;那么你还是比较适合学Java的&#xff0c;如果你大学期间学过Java那就更好了&#xff0c;现在再学习只会事半功倍。因为学习Ja…

C++浅拷贝和深拷贝的区别

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** c默认的拷贝构造函数是浅拷贝 浅拷贝就是对象的数据成员之间的简单赋值&#xff0c; 如…

Innodb ibdata数据文件误删,如何恢复

Innodb的ibdata数据文件误删除后的操作流程&#xff1a;注意&#xff1a;误删除后&#xff0c;你的数据库是还可以工作的&#xff0c;数据照样可以写入&#xff0c;切记&#xff0c;千万不要把mysqld进程杀死&#xff0c;否则就没法挽救了。首先找到mysqld的进程pid&#xff0c…

redis的java客户端名称_java里常用的redis客户端简介

zepto返回顶部动画点击返回顶部 function goTop(acceleration, time) { acceleration acceleration || 0.1; time time || 16; v ...Jetty Maven Plugin配置官方文档:http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#maven-config-https 1 ...p…

Python初步

准备在工作之余看看Python的东西 收录一些资料 Python初学者&#xff08;零基础学习Python、Python入门&#xff09;常见问题&#xff1a;书籍推荐、资料、社区 http://blog.csdn.net/xiaowanggedege/article/details/8566606 小甲鱼零基础入门学习Python(全87集) http://pan.b…

java arraylist string_在Java ArrayList String中使用contains

你是对的。 ArrayList.contains()testingequals()&#xff0c;而不是对象标识&#xff1a;返回true当且仅当此列表包含至less一个元素e&#xff0c;使得(o null&#xff1f;e null&#xff1a;o.equals(e))如果你有一个NullPointerExceptionexception&#xff0c;请validatio…

Xcode7,ios9 issue ,warning合集

1.Downcast from UIViewController only unwraps optionals;did you mean to use!? 原&#xff1a; let view mainStory.instantiateInitialViewController() as! UIViewController window?.rootViewController view 修改&#xff1a; if let view mainStory.instantiate…

高中数学排列组合公式/排列组合计算公式

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 排列 P------和顺序有关 组合 C -------不牵涉到顺序的问题 排列分顺序,组合不分 例如…

矩阵快速幂 POJ 3070 Fibonacci

题目传送门 1 /*2 矩阵快速幂&#xff1a;求第n项的Fibonacci数&#xff0c;转置矩阵都给出&#xff0c;套个模板就可以了。效率很高啊3 */4 #include <cstdio>5 #include <algorithm>6 #include <cstring>7 #include <cmath>8 using namespace st…

java 接口和抽象类的区别6_JAVA基础篇-接口和抽象类的区别

.前言JAVA是一种面向对象语言,具备抽象(Abstract),封装(packing),继承(extends),多态(polymorphic)四大特性。我们重点从oop思想∠来分析。.在面向对象的四大特性的作用体现抽象:父类为子类提供一些属性和行为&#xff0c;子类根据业务需求实现具体的行为(这时抽象类派上了用场…

笔试常见的智力题(附答案)

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** A.逻辑推理 1、你让工人为你工作7天&#xff0c;给工人的回报是一根金条。金条…

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;等…

could not build module ‘Foundation’, could not build module ‘UIKit’……23个错误

pch文件加入 #import <Availability.h> #ifndef __IPHONE_3_0 #warning "This project uses features only available in iOS SDK 3.0 and later." #endif #ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> 转载于:htt…

java中钩子函数回调函数_钩子函数 和回调函数

标签&#xff1a;http://blog.csdn.net/lipeionline/article/details/6369657 转自也可以这样&#xff0c;更容易理解&#xff1a;回调函数就好像是一个中断处理函数&#xff0c;系统在符合你设定的条件时自动调用。为此&#xff0c;你需要做三件事&#xff1a;1. 声明&…

css3 定义选择器

引言&#xff1a;CSS样式规则有两个主要部分。选择器决定将格式化应用到哪些元素。声明则定义要应用的格式化。 构造选择器选择器可以定义五个不同的标准来选择要进行格式化的元素。 元素的类型或者名称。如下所示。 h1{color:red; } 元素所在的上下文。如下所示。 h1 em{color…