C语言变量

1.程序在内存中的分段

当程序开始运行后,会加载到内存中,会把内存分成若干个段,每一段的功能、权限不同。
代码段(text):程序中的二进制指令存储在此段,只读权限。
只读段:存储常量、字符串字面值。
bss段:静态数据段,程序运行时会先清理。
全局段(data):存储全局变量。 栈:局部变量,由操作系统管理,自动申请、释放。
堆:由程序员手动管理。
text、bss、data,程序编译完成后大小就确定了,可以使用size 文件名查看。

2.变量的属性

存储位置:变量使用是那一段内存
作用域:变量的使用范围
生命周期:创建时间~销毁时间

3.变量的分类

(1)全局变量:定义在函数外。
存储位置:未初始化存储在bss,被初始化了存储data
作用域:整个程序,比如在a.c定义全局变量,在b.c中也可以使用
生命周期:main函数执行前就被定义出,程序运行结束后再释放在这里插入代码片
(2)局部变量:定义在函数内。
存储位置:栈
作用域:所在的函数内
生命周期:从定义语句开始~函数执行结束,函数每调用一次就会进行一遍定义、释放。
(3)块变量:定义在if、for、while等语句块内。
存储位置:栈
作用域:所在语句块的大括号内
生命周期:从定义语句开始~函数执行结束。

4.修饰变量的关键词

(1)auto
用来定义自申请内存、自动释放内存的变量(局部、块变量)。
不加就代表加,与signed一样。
注意:全局变量前不能使用。
auto static int num;
(2)const
是对变量提供一种保护,但它不是常量。
变量一旦初始化后,就不能再显式修改它的值。
const修饰被初始化过的全局变量才是真正的常量,一旦修改就出现段错误,因为编译器把这种全局变量的存储位置划分成了text。
(3)static
限制作用域(全局变量、函数),改变存储位置、延长生命周期(局部、块变量)。
修饰变量:
全局变量:限制全局变量的作用域,只能在它所在的.c内使用
局部、块变量:改变存储位置,由栈改为bss或data,但作用域没有变,并且会延长生命周期。
修饰函数: const int > func(void); const修饰的是函数返回值。
static int func(void); static修饰的是函数。 >
由普通函数(外部函数)变量成内部函数,只能在.c文件内调用。
(4)register
计算机的存储介质:硬盘-》固态硬盘-》内存-》缓存-》寄存器。
申请把变量的存储位置更改为寄存器,因为寄存器不一定成功。
寄存器变量不能取地址,&变量名。
(5)volatile
不稳定,易变的,修饰线程间共享的变量,或者硬件编程时使用。
如果一个变量值没有被显式的修改,编译器不会再次从内存中读取它的数值,而是直接使用上次的读取结果(优化)。
volatile的功能就是告诉编译器变量的值随时可能发生变化,不要优化它的取值过程(每次用到变量时都去内存中获取它的值)。
int > num = 10; num == num; // 永远为真
volatile int num = 10;
num == num; // 也可能为假
(6) extern
声明变量,多文件中共享全局变量时使用,谁使用谁声明。
定义:创建变量名,分配存储空间。
声明:创建变量名。 a.c中定义一个全局变量,b.c中如果想使用。 int num = 100; int num = 100;

5.输出缓冲区

通过printf输出的信息并不会立即显示出来(把数据先存储到缓冲区中),而是要满足一些条件:
1、从输出状态切换到输入状态。
2、遇到\n。
3、数据量达到4k。
4、程序结束。
5、手动刷新fflush。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值