一.全局变量:定义在函数外部
生命周期:从程序运行开始创建,程序退出销毁
作用域:从定义该变量开始一直到文件的结束
默认值:0
内存区域:全局(静态)变量区
链接属性:外部(可以在其他文件中引用)
例:在max.cpp中定义全局变量int a=10;
若在min.cpp中调用a,使用extern int a就能声明全局变量a,然后就可以使用a
二.静态全局变量:定义在函数外部
与全局变量区别:定义时加上 static
生命周期:从程序运行开始创建,程序退出销毁
作用域:从定义该变量开始一直到文件的结束
默认值:0
内存区域:全局(静态)变量区
链接属性:内部(只可以在本文件中使用,不可以在其他文件中引用)
例:在max.cpp中定义静态全局变量static int a=10;
若在min.cpp中调用a,即使使用extern int a声明,仍不可使用a
三.局部变量:定义在函数内部的变量,包括函数形参
生命周期:进入函数时创建,函数退出时销毁
作用域:本函数内部有效
默认值:随机值
内存区域:栈
链接属性:无
例:
void Fun()
{
int a = 0;
a++;
printf("%d\n",a);
}
int main()
{
for(int i=0;i<10;i++)
{
Fun();
}
return 0;
}
结果:
四.静态局部变量:定义在函数内部的变量,包括函数形参
与局部变量区别:定义时加上 static
生命周期:进入函数时创建,程序结束时销毁
作用域:本函数内部(虽有静态二字,但由于是局部变量,在非定义函数中无法使用)
内存区域:全局(静态)变量区
默认值:0
链接属性:无
例:
void Fun()
{
static int a = 0;//第一次进入才执行
a++;
printf("%d\n",a);
}
int main()
{
for(int i=0;i<10;i++)
{
Fun();
}
return 0;
}
结果:
五.动态内存
生命周期:调用动态内存创建函数才创建,调用动态内存释放函数时销毁
作用域:创建成功后没有进行释放时只要获得动态内存的首地址都可使用
默认值:无
内存区域:堆
链接属性:无
例:
#include <stdio.h>
#include<stdlib.h>
int * Fun()
{
int *p=(int *)calloc(20,sizeof(int));
return p;
}
int main()
{
int *p=Fun();
p[0]=1;
for(int i=0;i<20;i++)
{
printf("%3d",p[i]);
}
free(p);
return 0;
}
结果:
六.函数:外部函数,内部函数(加上static)
内存区域:代码段
链接属性:有static 内部
无static 外部
例:在max.h中存放Max函数的声明
int Max(int a,int b);
在max.cpp存放Max函数的实现和Min函数的实现
在主函数页添加max.h头文件便可使用Max函数,若想使用Min函数必须用extern 声明Min函数 :extern int Min(int ,int );
若在Min函数前添加static即使使用extern 声明Min函数也无法使用Min函数
例题:
#include <stdio.h>
#include <stdlib.h>
int Max(int a,int b)
{
return a>b?a:b;
}
int g_a=10;
int main()
{
int a=10;
static int b=20;
int *p1=&a;
int *p2=&b;
int *p3=(int *)malloc(20);
int *p4=&g_a;
int (*p5)(int,int)=Max;
return 0;
}
&p1,p1,&p2,p2,&p3,p3,&p4,p4,&p5,p5分别在那个内存区域?
&p1 栈 p1=&p2 栈
&p2 栈 p2=&b 全局(静态)数据区
&p3 栈 p3 堆
&p4 栈 p4=&g_a 全局(静态)数据区
&p5 栈 p5 代码段