程序结构之静态本地变量

静态本地变量:

  • 在本地变量定义时加上static修饰符就成为静态本地变量
  • 当函数离开的时候,静态本地变量会继续存在并保持其值
  • 静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值

实例:

#include <stdio.h>
int main(int argc,char const *argv[]) {
    f();
    f();
    f();
    return 0;
}

int f() {
    static int all;
    printf("%d\n",all);
    all += 1;
    return all;
}

运行结果:

0
1
2
  • 静态本地变量实际上是特殊的全局变量
  • 它们位于相同的内存区域
  • 静态本地变量具有全局的生存期,函数内的局部作用域(只能在定义它的函数内访问)
    • static在这里的意思是局部作用域(本地可访问)

实例:

#include <stdio.h>
int gAll = 10;
int main(int argc,char const *argv[]) {
    f();
    return 0;
}

int f() {
    int k=0,j=0;
    static int all;
    printf("&gAll = %p\n",&gAll);  //%p输出指针值,以16进制输出,32位平台输出4个字节,64位平台输出8个字节    printf("&all  = %p\n",&all);
    printf("&k    = %p\n",&k);
    printf("&j    = %p\n",&j);
    return all;
}

运行结果:

&gAll = 0x80496c0
&all  = 0x80496c8
&k    = 0xff92a6f4
&j    = 0xff92a6f0

观察可发现静态本地变量和全局变量在同一快内存区域放着,也就解释了上面的例子中 all 未初始化的默认值是 0 ,一般本地变量在另一块内存放着,很容易理解了。

原文地址:https://www.cnblogs.com/songbeyond/p/12505429.html

时间: 2024-11-13 09:44:18

程序结构之静态本地变量的相关文章

C语言学习--全局变量、静态本地变量

全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数无关 在任何函数内部都可以使用它们 #include <stdio.h> int f(void); int gAll = 12; int main() { printf("gAll in %s function is %d\n",__func__,gAll); //注意:__func__是输出是哪个函数,下划线是两个连着一起 f(); printf("gAll ag

C语言之程序结构

一个好的程序首先要有好的程序结构,我从变量和结构两个方面来做分析. 一.浅谈程序中的变量 一个程序架构最基本的就是程序变量,谈到程序中的变量,我们应该考虑两部分,一方面是变量的作用域,一方面是变量的生存期. 我们就从这两个角度对变量进行分析: (1)全局变量全局变量的声明要放在主函数之前,它的作用域是整个程序全局,生存期是程序整个周期. (2)局部变量局部变量是在某个局部声明的变量,它的作用域为特定区域,例如函数体内声明的变量作用域在函数体内,函数体执行完成则完成.如果变量声明在一个for语句里

程序结构之返回指针的函数

返回指针的函数: 返回本地变量的地址是危险的 返回全局变量或者静态本地变量的地址是安全的 返回在函数内 malloc 的内存是安全的,但是容易造成问题 最好的做法是返回传入的指针 实例: #include<stdio.h> int* f(void); void g(void); int main(int argc,char const *argv[]) { int *p = f(); printf("*p=%d\n",*p); g(); printf("*p=%d

黑马程序员---C基础3【变量的易错】【程序结构】【if语句】【Switch语句】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [变量的易错] 1.变量为什么要初始化为0 int  sum,a=3: sum = sum+a 如果未初始化则会成为一个不确定的变量,结果也会不确定,容易出错. 2.不同类型的变量之间的转换 切记int  a=1,b=0:b=1-1.5:其中b为一个整型所有结果是保留整数部分的0,而不是-0.5,又因为0没有正负之分,所有保存结果为b=0: 3.关于Xcode的一个快速注释的插件 快捷键://

Python的程序结构[3] -&gt; 变量/Variable -&gt; LEGB 法则

LEGB法则 / LEGB Rule LEGB 变量搜索顺序 ---- 来源于<Python学习手册>/ Learning Python Page 419 ---- Python 的变量名解析机制称为  LEGB 法则. L – Local: 本地作用域; E – Enclosing: 上一层结构中 def 或 lambda 的本地作用域; G – Global: 全局作用域; B – Build-in: 内置作用域. LEGB作用域查找原则:当引用一个变量时,Python 按以下顺序依次进行

.Net学习难点讨论系列17 - 线程本地变量的使用

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD

JavaWeb-07(tomcat与web程序结构与Http协议与Servlet基础)

JavaWeb-07 JavaWeb-tomcat与web程序结构与Http协议与Servlet基础 HTTP协议(记住) 1.http协议:规定了客户端和服务端交流时的数据格式 a. WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议. b. HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程及数据本身的格式. c. HT

线程本地变量的使用

Net学习难点讨论系列17 - 线程本地变量的使用 关于C#多线程的文章,大部分都在讨论线程的起停或者是多线程同步问题.多线程同步就是在不同线程中访问同一个变量(一般是线程工作函数外部的变量),众所周知在不使用线程同步的机制下,由于竟态的存在会使某些线程产生脏读或者是覆盖其它线程已写入的值(各种混乱).而另外一种情况就是我们想让线程所访问的变量属于线程自身所有,这就是所谓的线程本地变量.下文我们将逐渐扩展一个最简单的示例代码,来展示上面所说的变量并发访问以及线程本地变量的区别和各自解决方案. 这

第五章 程序结构

返回值 系统自动生成返回值的副本,该副本可以在程序中的返回点获得 函数原型声明 除非函数的定义在相同源文件的前面,否则必须使用函数原型声明(通常在#include和using之后): #include <iostream> using namespace std; double power(double x,int y);  //函数原型声明,形参可以和函数实现不同甚至只写double,int int main() { x=power(y,z); } double power(double x