一、全局变量、局部变量、动态内存、函数存放区域(内存区域)
首先我将通过以下简图对全局变量、局部变量、动态内存、函数的存放区域进行简单介绍
二、全局变量、局部变量、动态内存、函数的生命周期、作用域、默认值/链接属性
1.全局变量
(1)概念:定义在函数外面的变量.不建议使用。
(2)生命周期:从程序运行开始创建,程序结束才销毁,周期长。
(3)作用域:从定义开始直到文件结束都能使用。
(4)默认值/链接属性:普通全局变量和静态全局变量的默认值均为0,但普通全局变量的链接属性为外部(对外可见),静态全局变量的链接属性为内部(对外不可见)。
(5)内存区域:普通全局变量为栈(是对于外部的全局),静态全局变量为静态变量区
我将通过以下代码段对全局变量的各性质进行进一步分析:
#include"stdio.h"
int g_a = 10;//全局变量
static int g_b = 20;//静态全局变量
//for(int i=0;i<10;i++) ;//error #下 函数上 不能直接有语句 编译从上往下进行
(
int g_n = 80;
static int gs_m = 90;//内部符号对外不可见
//该部分是在另一个源文件创建定义的,在下边主函数会用到,而调用时需用到引用外部符号extern,如下所示
)
extern int g_n;//引用外部符号
extern int gs_m;
int main()
{
printf("%d,%d\n",g_a,g_b);
printf("g_n=%d\n",g_n);//ok
printf("gs_m=%d\n",gs_m);//error,因为在另一个源文件中定义gs_m时在前面加了static关键字,
//所以其链接属性为内部,对外不可见,所以在此不能打印出来。
return 0;
}
注:静态(static)C++修饰的只有一个链接属性,如果有链接属性,加上static关键字则由外部变为内部。
2.局部变量
(1)概念:定义在函数内部,包括形参,分为(普通局部变量和静态局部变量)
(2)生命周期:普通局部变量为:进入函数时创建,退出函数时销毁,静态局部变量为:进入函数时创建,程序退出时结束。
(3)作用域:本函数内部
(4)默认值/链接属性:普通局部变量无默认值,静态局部变量默认值为0,普通局部变量和静态局部变量均无连接属性。
(5)内存区域:普通局部变量为栈,静态局部变量为静态变量区
我将通过以下代码段对全局变量的各性质进行进一步分析:
void Fun()
{
static int a = 0;
a++;
printf("%d\n",a);
}
int main()
{
int a; //普通局部变量,栈
int b = 10;
static int sa;//静态局部变量,静态变量区
static int sb = 20;
printf("%d\n",sa);
for(int i=0;i<10;i++)
{
Fun();
}//在此打印1-10,因为Fun函数中静态局部变量a在程序结束时才销毁,"static int a = 0;"
//该语句只执行一次,在程序二次进入时,该语句被忽视,因为a未被销毁,只需创建一次就好
//但当将"static int a = 0;"改为" int a = 0;"则打印10个1。因为这样的话,在程序每次进入时,都要进行创建。return 0;}
3.动态内存
(1)生命周期:什么时候需要,什么时候申请 (注:需要free,容易出现内存泄漏)
(2)默认值/链接属性:默认值为随机值,无链接属性
(3)内存区域:栈
4.函数
(1)概念:函数分为静态(内部函数,内部用)和非静态(外部函数,对外服务,在头文件中描述<需注意的是头文件只放声明,不放定义>)
内部函数和外部函数的区别:
<1>内部函数 不需要那么严格的检查,若检查,需要付出很大代价,加静态关键字static(静态关键字的主要应用,不对外提供服务)。
<2>外部函数 需进行严格的检查,放在头文件中让别人使用。
(2)内存区域:代码段