黑马程序员——c语言学习—作用域详解
来源:互联网 发布:百度文库离线文件json 编辑:程序博客网 时间:2024/05/12 22:13
-----------Java培训、Android培训、IOS培训、.Net培训、期待与您交流!------------
本节我们系统学习一下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来修饰(一般可以省略),所以又称为自动变量,局部变量只在{}内定义后有效,{}结束后自动销毁,存储在栈空间(一级缓存)内,他的作用域只限于这个{}内,定义如下:
局部变量是定义在{}内的普通变量,用auto来修饰(一般可以省略),所以又称为自动变量,局部变量只在{}内定义后有效,{}结束后自动销毁,存储在栈空间(一级缓存)内,他的作用域只限于这个{}内,定义如下:
void test(){ auto int a; // 可以和全局变量重名,在此之后,访问的a都是局部变量 int b; // 省略auto(一般用法) register int c; // 告诉编译器采用寄存器的方式存储变量(速度快,但是会不会做取决于编译器) // 注:寄存器变量只能做局部变量或者形参,同时他无法取得地址}
局部变量在函数内使用后会被销毁,有的时候我们希望这个变量在整个程序周期内不被销毁,静态变量可以实现这个作用:
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常量进行优化存储。
const修饰词修饰的变量(全局、局部、静态),在其生命周期内无法被修改。也因此,const常量在初始化的时候必须赋值。编译器会对const常量进行优化存储。
5、volatile修饰词
在前面介绍的各种变量,编译器可能会根据电脑的不同进行某种优化,比如const类型的变量,因为他是不能改变的,就可以放在读取较快,访问较慢的静态存储区(这个由编译器决定是否这样做,或者其他的做法),而volatile修饰词则告诉编译器,这个值是可能变化的,不要给我优化。说白了,用volatile修饰的变量,每一次都直接访问该变量地址来取得值。例如:
在前面介绍的各种变量,编译器可能会根据电脑的不同进行某种优化,比如const类型的变量,因为他是不能改变的,就可以放在读取较快,访问较慢的静态存储区(这个由编译器决定是否这样做,或者其他的做法),而volatile修饰词则告诉编译器,这个值是可能变化的,不要给我优化。说白了,用volatile修饰的变量,每一次都直接访问该变量地址来取得值。例如:
volatile int a; // 采用volatile修饰的变量是直接通过地址访问的 int b = a; int c = a;由于a是直接地址访问的,他可能会改变,b和c的值可能不同,在这里,如果我们不加volatile修饰词,编译器发现a的值没有被修改,则可能直接绕过变量a的地址,直接调用前一次得到的数值来操作。
volatile在编写单片机或者嵌入式等硬件开发时,使用较多。
-----------Java培训、Android培训、IOS培训、.Net培训、期待与您交流!------------
0 0
- 黑马程序员——c语言学习—作用域详解
- 黑马程序员——c语言学习—变量作用域
- 黑马程序员——IOS学习笔记(C语言存储方式和变量作用域)
- 黑马程序员---C语言变量作用域
- 黑马程序员——C语言学习——概述
- 黑马程序员——c语言学习—函数
- 黑马程序员——C语言学习总结1-10
- 黑马程序员——C语言学习总结11-21
- 黑马程序员——C语言学习总结22-32
- 黑马程序员——c语言学习---第一个程序
- 黑马程序员——c语言学习---变量与存储
- 黑马程序员——c语言学习---运算
- 黑马程序员——c语言学习---选择结构
- 黑马程序员——c语言学习---循环
- 黑马程序员——c语言学习---数据结构
- 黑马程序员——c语言学习---指针的探讨
- 黑马程序员——07C语言函数学习
- 黑马程序员——09C语言其他数据类型学习
- leetcode_62_uniquepaths_
- 企业号处理请求
- 今年暑假不AC hdu2037 事件序列问题
- NYOJ--125 盗梦空间【水题】
- Linux命令2——cd
- 黑马程序员——c语言学习—作用域详解
- Android 遍历界面控件
- Android 文件下载
- Linux命令3——pwd
- 抓取网络json数据并存入mongodb(2)
- Objective-C的对象等同性
- Axure Mobile原型发布工具说明
- No CPU/ABI system image available for this barget
- unity之台湾游戏教父王俊博:做永远的抬轿人