转自http://hi.baidu.com/jxq61/item/78353bec06149c0f570f1d8f

一 局部变量:

在函数体内声明的变量, 称为 局部变量.

二 自动局部变量与静态局部变量

局部变量在声明时, 在类型前可以加 auto 或 static 修饰.

auto int a ;   表示 a 是自动局部变量,    auto   关键字可以省略, 它与 int    a ; 等价.

static int b ;    表示 b 是 静态局部变量.

三 自动局部变量 与 静态局部变量 的区别

1 自动局部变量 在退出函数时, 该变量及其值将"自动" 消失.

当再次执行这个变量所在的函数时, 系统"自动" 重新建立该变量, 与上一次运行时的结果毫不相干.

自动局部变量在函数内定义,    生存期为从每次执行到声明处开始,到退出函数体时止.

2 静态局部变量 在退出函数时, 该变量及其值不会 消失,

当再次执行这个变量所在的函数时, 它仍然保持上次 运行时的结果 .

静态局部变量在函数内定义,    生存期为从首次执行到声明处开始,到整个程序运行结束时止.

#include "stdafx.h"
#include <stdio.h>
int mmfunc1 ( )
{
          static int a = 0;    // 静态 局部变量
                              // 该语句仅在第一次执行 mmfun1 时执行

a = a+1;
         return a;
}
int mmfunc2 ( )
{
       int a = 0;             // (自动) 局部变量
                              // 该语句在每次执行 mmfun2 时执行

a = a+1;
        return a;
}

int _tmain(int argc, _TCHAR* argv[])

{

printf("mmfunc1=%d, mmfunc2=%d\n", mmfunc1(),    mmfunc2());

printf("mmfunc1=%d, mmfunc2=%d\n", mmfunc1(),    mmfunc2());

printf("mmfunc1=%d, mmfunc2=%d\n", mmfunc1(),    mmfunc2());

getchar();    return 0;

}

--- 结果 ---

mmfunc1=1, mmfunc2=1
mmfunc1=2, mmfunc2=1
mmfunc1=3, mmfunc2=1

四 静态局部变量的用途

一般情况下, 我们使用 自动变量就可以了, 什么情况下会使用"静态局部变量"呢?

<< 神探狄仁杰 >> 中为我们描述了很多这种例子:

一般情况下, 客人住进客栈, 走时付款结帐,从此两不相欠. 但是有一种人, 他走时不但没结帐,还带走房间的钥匙, 为什么呢? 是包房呀. 下次再来时方便呀.于是, N 多的故事就此展开............

当从函数中返回一个 int, double, char 类型的数据时 , 用 return x; 没问题, x 是自动局部变量或静态局部变量或常数都可以.

当我们需要从函数中返回一个指向局部变量的指针时候, 如果是"指向自动局部变量",由于自动局部变量离开函数体时本身已经香销玉殒, 返回的指针已不可用.

如果我们把一个函数体当作一家"悦来客栈", 局部变量是"悦来客栈"里的 "天字号房间", 要想从函数体外部直通客栈里的房间,你可以使用"包房" ----> 静态局部变量.

可以象下面这样使用静态局部变量

------- C 及 C++ 均支持的方法 ----------

int * fun1( )
{
     static int a; // 如果去掉 static 本函数不能正常工作
     a = 5;
     return &a;
}

或者:

------- 仅 C++ 支持的方法 ----------
int & fun2( )
{
    static int a;
    a = 5;
    return a; // 此处返回的 a 不是5,而是指向 a 的"引用"
}

为了演示局部静态变量的用法,分析下面程序的执行结果, 请分析为什么两次调用 func(10) 的值显示的结果不同呢?:

#include "stdafx.h"
#include <stdio.h>

int * func( int n )
{
    static int a = 0;   // a 是 天字一号 "包房"
    a = a + n;
    return & a ;
}

int _tmain(int argc, _TCHAR* argv[])
{

int *p;             // p 是通向 天字一号包房的钥匙
p = func( 10);
printf( "*p = %d \n", *p);
*p = 100;            // 此时修改func函数体内的 a 变量的值
p = func( 10);
printf( "*p = %d \n", *p);

getchar()

return 0;

}

---- 运行结果 ------

*p = 10

*p = 110

说明: 程序 中如果去掉 static 关键字, 运算结果或者不可预知,或者出错.

转载于:https://my.oschina.net/liangzhenghui/blog/112635

自动局部变量 与 静态局部变量 的区别与用途相关推荐

  1. 静态全局变量、全局变量、普通局部变量、静态局部变量四者之间的区别

    按存储区域分:全局变量.静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1.全局变量在整个工程文件内都有效: 2.静态全局变量只在定义它的文件内有效: 3. ...

  2. static局部变量(静态局部变量的用法)

    有时希望函数中的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的储存单元不释放,在下一次调用此函数时,该变量已经有值(就是上一次函数调用结束时的值).这时就应该指定该局部变量为" ...

  3. c语言中全局变量多线程调用-局部变量、静态局部变量、全局变量与静态全局变量分析

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  4. 描述一下普通局部变量,普通全局变量,静态局部变量,静态全局变量的区别

    项目 Value Value Value Value 普通局部变量 存在栈区 不初始化内容随机 只在定义的复合语句中有效 复合语句结束变量空间释放 普通全局变量 存在全局区 不初始化内容为0 整个进程 ...

  5. 局部变量和静态局部变量

    一.局部变量 局部变量也叫auto自动变量(auto可写可不写),一般情况下代码块{}内部定义的变量都是自动变量,它有如下特点: 1.作用域 a.在一个函数内定义,只在函数范围内(也就是在定义变量的{ ...

  6. 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)...

    我们先来看内存中的几大区:  内存到底分几个区? 下面有几种网上的理解,我整理一下: 一: 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构 ...

  7. c语言静态变量与局部变量,C语言 全局变量、静态全局变量、局部变量、静态局部变量...

    //test.c #include extern int global_var; void test_global_var() { global_var++; printf("global_ ...

  8. 全局变量、静态全局变量、静态局部变量和普通局部变量的区别

    按存储区域分:全局变量.静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1.全局变量在整个工程文件内都有效: 2.静态全局变量只在定义它的文件内有效: 3. ...

  9. c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

最新文章

  1. 1.1.2 标准化工作及相关组织
  2. 给echarts添加筛选时间控件时,控件不显示,并设置数据库无数据时echarts模块显示暂无数据
  3. SAP BTP Kyma Runtime dashboard 打开报缺少缺陷的错误消息该如何解决
  4. 再说invoke和begininvoke
  5. CStringArray 字符串数组的使用 以及调试时怎么Dump出其中的内容
  6. VS调试异常代码 HRESULT:0x80070057 (E_INVALIDARG)解决方法
  7. 后缀转中缀表达式_中缀转后缀表达式代码实现(下)及计算器完整版
  8. 利用Runtime为Category添加属性
  9. g4600黑苹果efi_Matebook 13/14 黑苹果 通用EFI分享amp;安装教程?
  10. 敢不敢用一年时间改变你自己?
  11. c语言万年历方案论证,C语言编写方案-万年历分析.doc
  12. 深度学习(deep learning)发展史
  13. Android集成阿里云一键登录步骤
  14. 怒肝半月!Python 学习路线+资源大汇总
  15. NASA HEG tool安装心得
  16. 多个android手机客户端通信,android中利用Socket实现手机客户端与PC端进行通信
  17. UVA 11549 模拟 Floyed判圈法的应用 Calculator Conundrum
  18. Sonic测试平台搭建--设备接入
  19. android studio各个资源文件夹以及作用备注
  20. IE11 中的兼容性更改

热门文章

  1. 弄懂CNN,然后提升准确率4.21-4.27
  2. [BZOJ1322]Destroying The Graph
  3. Java 随心笔记10
  4. C#基础第七天-作业-利用面向对象的思想去实现名片-动态添加
  5. Visual Studio 2010/2013 UTF8编码调试时显示中文
  6. SQL基础---SQL ORDER BY 子句
  7. Go 语言web 框架 Gin 练习6
  8. 机器学习导论(张志华):核定义
  9. C++需要输出一个参数的地址时可能达不到预期的效果
  10. 科大星云诗社动态20210516