#### 变量存储类别 ####
C语言**根据变量的生存周期**来划分,可以分为**静态存储方式和动态存储方式。**
**静态存储方式:**是指**在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量**。
**动态存储方式**:是指**在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。**
C语言中**存储类别**又分为四类:**自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。**
* 1、**用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式**。如:
![](http://img.mukewang.com/54995b8c0001df9003570077.jpg)
**自动变量就是存储在栈中的变量,这些变量一般在块中定义,当执行时,系统自动为这些变量分配内存,当块结束时,系统自动回收这些变量占用的内存,因此叫做自动变量。**
**函数的形式函数,函数块中点故意的变量,复合语句块中定义的变量,都是自动变量**
* 2、**用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量**。**如下为静态局部变量:**
![](http://img.mukewang.com/54995d1e0001a1bc04020299.jpg)
**注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。**
> **静态变量是指存储在静态区的变量,这些变量从定义开始就占用着内存,直到程序结束,因此它的内存地址固定不变,静态变量可以局部定义,这样的变量叫做静态局部变量;静态变量可以在全局定义,这样的变量叫做静态全局变量。**
**静态局部变量**
**静态局部变量和局部变量的区别:局部变量不会一直占据着内存,当函数结束时,局部变量所占用的内存就会被释放,但是静态局部变量会一直占据着内存,直到程序结束,因此当程序调用结束后,局部变量的值有可能被其他值所覆盖,而静态局部变量的值仍然保存着,并作为下次调用该函数时该静态局部变量的初始化值,静态局部变量第一次初始化的值并不是一直不变,再次调用该函数,初始化值为上一次程序结束时,函数返回的静态局部变量的值。**
#include <stdio.h>
void show()
{
static int x=4;
printf("%d\n",x);
x++;
}
int main()
{
show();
show();
return 0;
}
**假如不给静态局部变量赋一个初值,那么编译时自动赋初值为0.**
#include <stdio.h>
int add(int n)
{
static int x=1;//因为每次要保存相乘的结果,所以要用到静态局部变量x,
x=x*n;
return x;
}
int main()
{
int i,n;
printf("请输入一个整数:");
scanf("%d",&n);
for(i=1;i<=10;i++)
printf("%d的%d次幂为:%d\n",n,i,add(n));
return 0;
}
> 上述程序为何不用全局变量来实现,因为全局变量作用域较大,会带来一些隐患,如容易造成名字污染,而且全局变量的值也容易被修改,因此尽量避免使用全局变量。
**静态全局变量**
#include <stdio.h>
static int x;
int main()
{
printf("%d",x);
return 0;
}
**静态全局变量与全局变量区别:**
**静态全局变量的作用域仅局限于他所处的文件中,其他的文件即使使用extern声明也不能访问它;全局变量的作用域是整个工程,在工程的一个文件内定义的全局变量,在该工程的另一个文件中,通过extern声明,就可以使用全局变量。全局变量与静态全局变量的存储区域相同,都是存储在静态区。**
* 3、**为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”**,用**关键字register作声明**。例如:
![](http://img.mukewang.com/54995ed300014b2a03570078.jpg)
**注意:只有局部自动变量和形式参数可以作为寄存器变量;一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;局部静态变量不能定义为寄存器变量。**
#include<stdio.h>
int main()
{
register int i,sum=0;//寄存器变量保存在寄存器中,节省了从内存读到寄存器的郭志诚,因此循环提速不少
for(i=1;i<=100;i++)
{
sum=sum+i;
}
printf("%d",sum);
return 0;
}
**寄存器是CPU的一部分,是一个有限容量的高速存储部件,可用来暂存指令、数据和地址。寄存器的读取速度很快,一般用它来给CPU传输数据,想内存或硬盘等的外部存储器里的数据都是先读到寄存器再送给CPU的,而寄存器变量则直接进入寄存器;由于寄存器容量有限,因此不能将一直占用内存的变量定义为寄存器变量;现在的编译系统都很智能,因此基本不用关键字register来声明寄存器变量;寄存器变量不在内存中,所以不能取地址符来取它的地址。**
* 4、**用extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量**。如:
![](http://img.mukewang.com/5499605c0001a4a204210141.jpg)
> **关键字extern来暗示其后的变量是在当前文件的后面或其他文件中定义的,告诉编译器,该变量将稍候定义或者在其他文件中定义,编译器将根据该变量的类型,从当前文件后面或者其他文件中找到该变量。**
1.c文件中的代码
#include <stdio.h>
extern int x;
int main()
{
printf("%d",x);
return 0;
}
2.c文件中的代码
```
int x=4;
```
- 前言
- JNI基础知识
- C语言知识点总结
- ①基本语法
- ②数据类型
- 枚举类型
- 自定义类型(类型定义)
- ③格式化输入输出
- printf函数
- scanf函数
- 编程规范
- ④变量和常量
- 局部变量和外部变量
- ⑤类型转换
- ⑥运算符
- ⑦结构语句
- 1、分支结构(选择语句)
- 2、循环结构
- 退出循环
- break语句
- continue语句
- goto语句
- ⑧函数
- 函数的定义和调用
- 参数
- 函数的返回值
- 递归函数
- 零起点学通C语言摘要
- 内部函数和外部函数
- 变量存储类别
- ⑨数组
- 指针
- 结构体
- 联合体(共用体)
- 预处理器
- 预处理器的工作原理
- 预处理指令
- 宏定义
- 简单的宏
- 带参数的宏
- 预定义宏
- 文件包含
- 条件编译
- 内存中的数据
- C语言读文件和写文件
- JNI知识点总结
- 前情回顾
- JNI规范
- jni开发
- jni开发中常见的错误
- JNI实战演练
- C++(CPP)在Android开发中的应用
- 掘金网友总结的音视频开发知识
- 音视频学习一、C 语言入门
- 1.程序结构
- 2. 基本语法
- 3. 数据类型
- 4. 变量
- 5. 常量
- 6. 存储类型关键字
- 7. 运算符
- 8. 判断
- 9. 循环
- 10. 函数
- 11. 作用域规则
- 12. 数组
- 13. 枚举
- 14. 指针
- 15. 函数指针与回调函数
- 16. 字符串
- 17. 结构体
- 18. 共用体
- 19. typedef
- 20. 输入 & 输出
- 21.文件读写
- 22. 预处理器
- 23.头文件
- 24. 强制类型转换
- 25. 错误处理
- 26. 递归
- 27. 可变参数
- 28. 内存管理
- 29. 命令行参数
- 总结
- 音视频学习二 、C++ 语言入门
- 1. 基本语法
- 2. C++ 关键字
- 3. 数据类型
- 4. 变量类型
- 5. 变量作用域
- 6. 常量
- 7. 修饰符类型
- 8. 存储类
- 9. 运算符
- 10. 循环
- 11. 判断
- 12. 函数
- 13. 数学运算
- 14. 数组
- 15. 字符串
- 16. 指针
- 17. 引用
- 18. 日期 & 时间
- 19. 输入输出
- 20. 数据结构
- 21. 类 & 对象
- 22. 继承
- 23. 重载运算符和重载函数
- 24. 多态
- 25. 数据封装
- 26. 接口(抽象类)
- 27. 文件和流
- 28. 异常处理
- 29. 动态内存
- 30. 命名空间
- 31. 预处理器
- 32. 多线程
- 总结
- 音视频学习 (三) JNI 从入门到掌握
- 音视频学习 (四) 交叉编译动态库、静态库的入门学习
- 音视频学习 (五) Shell 脚本入门
- 音视频学习 (六) 一键编译 32/64 位 FFmpeg 4.2.2
- 音视频学习 (七) 掌握音频基础知识并使用 AudioTrack、OpenSL ES 渲染 PCM 数据
- 音视频学习 (八) 掌握视频基础知识并使用 OpenGL ES 2.0 渲染 YUV 数据
- 音视频学习 (九) 从 0 ~ 1 开发一款 Android 端播放器(支持多协议网络拉流/本地文件)
- 音视频学习 (十) 基于 Nginx 搭建(rtmp、http)直播服务器
- 音视频学习 (十一) Android 端实现 rtmp 推流
- 音视频学习 (十二) 基于 FFmpeg + OpenSLES 实现音频万能播放器
- 音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)