一.前言
学习C语言这么久,在这对变量和内存总结一下 。
二.变量
-
局部变量:定义在函数内部的变量,包括形参。
-
全局变量:定义在函数外的变量,尽量少使用,很危险。
-
static:静态关键字.可以用来修饰全局变量,局部变量(不能修饰形参)和函数。正因为有这个关键词我们把变量又可以分为:静态变量和普通变量。
三.内存区域
C语言的内存区域主要有以下几种:
- 代码段:存放程序的代码;
- 全局(静态)变量区:存放全局变量和静态变量
- 栈:存放局部变量,系统自行管理该内存, 内存区域小,Windows默认1M.
- 堆:动态内存区域,内存区域大,需要由程序自行管理内存,使用后一定要释放,否则出现内存泄漏.
四.总结
链接属性:遇到项目里有,本文件中没有的变量我们可以用到链接属性 关键词是extern 在变量前加这个关键词就可以使用不在本文件中的变量
五.实验验证
1.静态局部变量和普通局部变量的区别:
#include<stdio.h>
void Func() //普通局部变量
{
int a = 0;
a++;
printf("%d\n", a);
}
void Func1() //静态局部变量
{
static int aaa;
aaa++;
printf("%d\n", aaa);
}
int main()
{
for (int i = 0; i < 10; i++)
{
Func();
}
printf("----------------------------------->\n");//区别结果 前为普通局部变量 后为静态局部变量
for (int i = 0; i < 10; i++)
{
Func1();
}
}
运行结果:
普通局部变量在函数结束时即释放,而静态变量则不会。
我们也必须注意一个细节:静态局部变量若未给出初值,将会自动赋0值:
2.普通全局变量与静态全局变量:
全局变量在函数外部声明定义,不给出初值直接自动赋值为0。
普通全局变量加上static关键字会出现什么样的变化(这里会用到链接属性)
首先我们先在源文件中添加一个新的文件
这里我们新建一个tmp.cpp的文件
然后在tmp.cpp中加入两个全局变量的定义,然后我们到主函数中来使用这两个变量。
这里我们会看到调用 tmp的时候正常:
当我们调用加了静态关键字的tmp时:
没有进行调试就已经出现了错误;static 将普通全局变量的默认链接属性外部修改为了内部,仅限一个文件内部使用。
注意:static和const的区别:
static(类型说明符) const(类型限定符)
const就是只读的意思,只在声明中使用;
static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放;
对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见;对于static函数也是在当前模块内函数可见.
(这块就是简单介绍一下区别 后面文章会详细说明)