关于局部变量和全局变量
变量分类:
局部变量
定义在函数体内部
未初始化,初始值为随机值
存储位置:栈区
生命周期:同函数共存亡
作用域:函数体内部
全局变量
定义在函数体外部
未初始化,初始值为0
存储位置:全局区
生命周期:同程序共存亡
作用域:整个程序
#include<stdio.h>
void func();
int a;//全局变量
int main()
{
//验证生命周期
func();
func();
func();
func();
func();
//验证作用域
//printf("main:a = %d\n",a);
return 0;
}
void func()
{
int b = 0;//局部变量
a = a+1;
b = b+1;
printf(“a = %d b = %d\n”,a,b);
}
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/6317658fb72555c2ce0317a8fa96eec6.png)
由上图可知,全局变量a影响全局,其值一直存在,作用域充满整个程序,生命周期与程序共存亡。
局部变量b,作用于函数内部,生命周期与其所在的函数挂钩,函数结束局部变量b的生命周期也会结束
外部引用
a.c
#include<stdio.h>
extern int a;
int main()
{
printf("a = %d\n",a);
return 0;
}
b.c
int a = 10;
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/0194bb3446028c7177377770c68d5267.png)
本次使用函数extern
当引用同一程序不同文件的变量时,通常添加extern修饰。
外部引用语句在全局,所引用的变量就可作用于所在文件。
如果引用语句在函数体内部,所引用的变量只能作用于所在函数。
外部引用,使用static静态型 修饰局部变量
使用static修饰上面b.c中的a变量。
a.c
#include<stdio.h>
extern int a;
int main()
{
printf("a = %d\n",a);
return 0;
}
b.c
static int a = 10;
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/63bf968c07a7095a5c7e9a8741fb5cdb.png)
编译报错,程序中static是静态变量,extern是外部变量,二者冲突。
这个报错是因为static 这个限制了局部变量的作用域。
于是,可以修改为:
a.c
#include<stdio.h>
extern int a;
void fun();
int main(){
fun();
return 0;
}
b.c
#include<stdio.h>
static int a=10;
void fun()
{
printf("a = %d\n",a);
}
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/1d0580485051c0c045a5063a0365ed03.png)
计算各数据类型占用空间的大小
#include<stdio.h>
int main()
{
printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(short)=%d\n",sizeof(short));
printf("sizeof(long)=%d\n",sizeof(long));
printf("sizeof(float)=%d\n",sizeof(float));
printf("sizeof(double)=%d\n",sizeof(double));
return 0;
}
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/e44ac1f91d5ad34b8c28737c195e5ab3.png)
内存分区
内存分为四个区域:堆、栈、全局/静态存储区、只读区(常量区和代码区)。
4G
内核占用
3G
栈区 :存储局部变量,由系统自动分配自动释放
----------------------------------------------------
堆区 :由用户手动申请(malloc)手动释放(free)的空间
----------------------------------------------------
全 .bss 存放未初始化的全局变量和静态变量
局 -------------------------------------------------
区 .data 存放已初始化的全局变量和静态变量
----------------------------------------------------
常量区 :存放常量(字符串常量等...)
----------------------------------------------------
代码段 :存放用户代码
0
全局变量和局部变量能否重名
可以重名。在函数内访问数据时以函数内部的局部变量值为准。
#include <stdio.h>
int num = 20;
int main()
{
int num = 10;
printf("%d\n",num);
return 0;
}
因为局部变量相较于printf近,故输出代码内的num=10
![](https://img-blog.csdnimg.cn/img_convert/8700648e9ec58d101acbce1185e5c4fb.png)
同一程序不同文件中的全局变量能否重名?
全局变量都可作用于整个程序,因此不得重名。
强制类型转换
代码示例
#include <stdio.h>
int main()
{
int a = 10 ,b = 2;
float num = (float)a/b; //将ab的int类型,强转为float类型
printf("%f\n",num);
return 0;
}
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/f497e89ac91c670ac92803e0a91770da.png)