首页 > 其他分享 >全局变量和局部变量以及静态修饰作用

全局变量和局部变量以及静态修饰作用

时间:2024-05-11 23:42:08浏览次数:23  
标签:变量 静态 局部变量 char volatile 修饰 存放 全局变量

1,全局变量和全局静态变量

a、全局变量:全局变量存放在静态存储区,作用域是全局(对比下面添加static),整个声明周期都可以使用,其他文件如需要使用,需要添加extern

b、全局静态变量 (static):分配的内存与全局变量一样,也是在静态存储内存上,其生命周期也是与整个程序同在的,从程序开始到结束一直起作用,
      全局静态变量作用域只在定义它的一个源文件内,其他源文件不能使用它。(也就是其他文件也可以用同样名字的静态变量)

相同点

是由编译器自动分配和释放的,

初始化的全局变量和静态变量放在同一块内存区中

在调用main之前,内存先从FASH copy 数据(全局/静态变量),和复制全0段的(全局/静态变量)

全局变量和静态变量从0x2000,000开始存。

2,局部变量和局部静态变量

局部静态变量分配的内存也是在静态存储内存上的,其第一次初始化后就一直存在直到程序结束(只初始化一次),该变量的特点是其作用域只在定义它的函数内可见,出了该函数就不可见了。
局部 变量      分配内存是分配在栈存储区上的,其作用域也只是在局部函数内,在定义该变量的函数内,只要出了该函数,该局部变量就不再起作用,该变量的生命周期也只是和该函数同在。-----------个人理解:局部变量可以节省内存,另外在函数内运算比全局变量快,但是切换函数需要入出栈。

3,代码举例

volatile int a = 0;  // 全局初始化区  ①存放在内存起始单元0x2000,0000  【在flash也占用空间】
volatile char *p1;   //全局未初始化区 ②存放在起始单元00x2000,0004     【在flash只占用描述空间】
void test(void)
{
    volatile  int t1=10;      //局部变量              ④存放在栈空间  0x2000,0600  【】
    volatile static int t2 =0;//局部静态变量          ③存放在起始单元0x2000,0008     
 //    printf("%d %d  ",t1,t2);//防止代码被优化
}
void main()
{
    
    volatile int b  = 0;                              //栈          ⑥存放在栈空间  0x20000620
    volatile char s[] = "abc";                        //栈          ⑤存放在栈空间  0x2000061C 
    volatile char *p2;                                //栈          存放在堆空间  0x20000618 
    volatile char *p3 = "123456";          //123456\0在常量区,p3在栈上。 0x20000614  
    volatile static int c =0;              //局部(静态)初始化区 ④存放在起始单元00x2000,000c
    test();
    
    //分配得来得10和20字节的区域就在堆区。
     p1 = (char *)malloc(10);
     p2 = (char *)malloc(20);
    volatile char *p4= (char *)malloc(20);  //存放在堆空间 0x20000610
    strcpy(p2, "123456");                               //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
    
    printf("%d %d %d %d  %d %d  %d ",a,s[0],&p3,c,p1,b,&p2,&p4);  //防止代码被优化
}

总结

标签:变量,静态,局部变量,char,volatile,修饰,存放,全局变量
From: https://www.cnblogs.com/icaowu/p/18187372

相关文章

  • nginx常用全局变量
    nginx常用全局变量$args请求中的参数,如www.123.com/1.php?a=1&b=2的$args就是a=1&b=2$content_lengthHTTP请求信息里的"Content-Length"$conten_typeHTTP请求信息里的"Content-Type"$document_rootnginx虚拟主机配置文件中的root参数对应的值$document_uri当前请求......
  • javaScript之局部变量,全局变量与局部作用域,全局作用域
    前端开发工作者,最需要学习的一门语言就是JavaScript了吧,其实学习大部分编程语言都是从基本的语法知识开始人门的。什么语句、变量、数据类型、对象、函数...今天本文就简单说明javaScript变量中的一个小小的知识点,其实在后面的最开始工作编程中我也是常常容易出现bug的一个点。......
  • C语言 父子进程不能共享全局变量
    父子进程不能共享全局变量。父子进程中的任何一方修改了全局变量,只是修改了副本,只对自己可见,对另一方不可见。C语言中即使加了static也不行。#include<stdio.h>#include<unistd.h>//初始值是0intflag;intmain(){pid_tpid;//父进程和子进程执行相同代码即......
  • TypeScript入门2:类、继承、访问修饰符
    classPerson{//实例属性id:number;name:string;age:number=18;//构造函数constructor(id:number,name:string){this.id=id;this.name=name;}//实例方法introduce():string{return`hello,Iam${this.name},and......
  • (2)对组件进行修饰
    1、组件都默认放在View里2、上一节的实例代码包含了2个组件:Image、Text,如果要添加新一个Text组件,如下:importSwiftUIstructContentView:View{varbody:someView{Text("TurtleRock").font(.title).foregroundColor(.green)......
  • vue之修饰符
    1修饰符分类·表单修饰符---(属于v-model进阶使用)·事件修饰符·按键修饰符·v-bind修饰符2、表单修饰符修饰符作用使用lazy填写信息之后,光标离开标签的时候才会将值赋予给valuetrim自动过滤用户输入的首个空格字符,中间的空格不会过滤number自动......
  • vue箭头函数、js-for循环、事件修饰符、摁键事件和修饰符、表单控制、完整购物车版本
    【箭头函数】1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<title>Title</title>6<scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">&l......
  • 读《我和Labview》7控件的局部变量和属性
    7.1控件与变量之间的关系7.2控件的标签和标题7.3控件的默认值7.4局部变量7.4.1创建局部变量7.4.2把数据写入控制控件,或从显示控件读取数据7.4.3应用与多线程间的共享数据7.5属性节点和调用节点7.5.1属性节点7.5.2关联控件7.5.3调用节点7.5.4应用实例-移动控件7.5.5应......
  • v-model的修饰符( .number .trim .lazy)
    v-model的修饰符 .number的作用是将绑定的值从string类型变为number类型 在上述代码中,我们在input元素绑定了blur事件,作用为当鼠标移出当元素,触发该事件去响应方案 可以看到在鼠标移出后,控制台打印的number类型为string当我们再v-model后加上修饰符.number后 控制台......
  • ThreadLocal 、 实例变量、静态变量 以及 局部变量的区别
    ThreadLocal的作用ThreadLocal用于声明一个变量,这个变量在每个线程中都会创建一份实例,各个线程之间的数据不能共享,某个线程中的ThreadLocal变量与线程进行绑定,能够保证变量的线程安全。使用示例一:/***@authorErywim2024/4/16*/publicclassTemp{publ......