美文网首页
变量类型与作用域

变量类型与作用域

作者: labi3285 | 来源:发表于2017-09-14 22:24 被阅读9次

本节我们系统学习一下c语言中的变量类型及作用域。

1、全局变量

全局变量是在从定义开始,到整个程序结束都存在的变量,他是在所有函数体的外面定义的变量,存储在静态存储区,所有的代码都可以访问,定义如下:

#include <stdio.h>  
  
int a; // 定义全局变量  
int main()  {  
    a = 10; // 函数内可以访问  
    return 0;  
}  

需要注意的是,如果在另一个文件内需要访问这个全局变量,或者在这个变量定义之前需要用到他,需要用extern关键词来做声明:

#include <stdio.h>  
  
extern int a; // 声明另一个文件中存在的全局变量  
void test() {  
    a = 12;  
} 

2、局部变量

局部变量是定义在{}内的普通变量,用auto来修饰(一般可以省略),所以又称为自动变量,局部变量只在{}内定义后有效,{}结束后自动销毁,存储在栈空间(一级缓存)内,他的作用域只限于这个{}内,定义如下:

void test(){  
    auto int a; // 可以和全局变量重名,在此之后,访问的a都是局部变量  
    int b; // 省略auto(一般用法)  
    register int c; // 告诉编译器采用寄存器的方式存储变量(速度快,但是会不会做取决于编译器)  
    // 注:寄存器变量只能做局部变量或者形参,同时他无法取得地址  
} 

3、静态变量

局部变量在函数内使用后会被销毁,有的时候我们希望这个变量在整个程序周期内不被销毁,静态变量可以实现这个作用:

void test() {  
    static int sa=0; // 该语句只会执行一次  
    printf("%d\n", sa);  
    sa++; // 静态变量的内容继承自上一次调用(此处可以记录函数调用的次数)  
}  
void test2() {  
    static int sa=5; // 此处的sa和前面的sa不是一个变量  
}

这里我们定义的sa是静态变量,存储在静态存储区,他在整个程序周期是不能销毁的,但是不同于全局变量的是,这个变量只能在定义他的函数内访问。

4、const修饰词

const修饰词修饰的变量(全局、局部、静态),在其生命周期内无法被修改。也因此,const常量在初始化的时候必须赋值。编译器会对const常量进行优化存储。

5、volatile修饰词

在前面介绍的各种变量,编译器可能会根据电脑的不同进行某种优化,比如const类型的变量,因为他是不能改变的,就可以放在读取较快,访问较慢的静态存储区(这个由编译器决定是否这样做,或者其他的做法),而volatile修饰词则告诉编译器,这个值是可能变化的,不要给我优化。说白了,用volatile修饰的变量,每一次都直接访问该变量地址来取得值。例如:

volatile int a; // 采用volatile修饰的变量是直接通过地址访问的  
int b = a;  
int c = a; 

由于a是直接地址访问的,他可能会改变,b和c的值可能不同,在这里,如果我们不加volatile修饰词,编译器发现a的值没有被修改,则可能直接绕过变量a的地址,直接调用前一次得到的数值来操作。
volatile在编写单片机或者嵌入式等硬件开发时,使用较多。

相关文章

  • JS回顾变量、作用域、内存问题

    基本类型和引用类型的值属性的动态复制变量值传递参数检测类型 执行环境与作用域延长作用域链没有块级作用域声明变量提升...

  • 变量类型与作用域

    本节我们系统学习一下c语言中的变量类型及作用域。 1、全局变量 全局变量是在从定义开始,到整个程序结束都存在的变量...

  • 作用域与变量提升

    作用域与变量提升 作用域 JS中变量的作用域有全局作用域和局部作用域两种,作用域简单来讲就是变量与函数的可访问范围...

  • Chapter 3. Variables and Simple

    一、作用域与生命期 变量从作用域与生命期角度来看有三种类型 全局变量在Swift文件的最顶层声明的变量就是全局变量...

  • Java程序基础面试题(一)

    常量与变量 变量变量包括变量名,变量类型和作用域几个部分,格式如下: 类型 标识符 = 初始值;ex: int ...

  • js中作用域与作用域链

    js中作用域与作用域链 作用域 *作用域基本概念 作用域一般指变量的作用范围,变量分为全局变量和局部变量,对应的作...

  • 从零开始复习Java-变量、常量、作用域

    变量(Variable) Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。 变量作用域 ...

  • JavaScript 作用域和作用域链

    JavaScript 作用域 作用域就是变量与函数的可访问范围。在JavaScript中,变量的作用域有全局作用域...

  • JavaScript作用域学习笔记

    作用域是变量与函数的可访问范围,作用域控制着变量与函数的可见性和生命周期。变量的作用域有两种:全局作用域和局部作用...

  • C语言函数定义域

    作用域:起作用的区域变量按作用域分:局部变量:定义在函数内部的变量全局变量 :定义在函数外部的变量变量按存储类型分...

网友评论

      本文标题:变量类型与作用域

      本文链接:https://www.haomeiwen.com/subject/ysejsxtx.html