13、内存管理—变量作用

内存管理—变量作用

一、普通局部变量

include <stdio.h>

int main(int argc, char const *argv[])
{
	int a = 10;

	if(1)
	{
		int a = 11;
		//就近原则
		printf("a = %d\n", a);//a = 11
	}

	//1、if()的a只能在if{}中使用
	//2、离开if{},if的a已经释放
	printf("a = %d\n", a);//a = 10

	return 0;
}


int main01(int argc, char const *argv[])
{
	//1、在{}内部定义的变量就是局部变量
	//2、只有执行到定义变量的这个语句,系统才会给这个变量分配空间
	//3、当离开{},这个非static局部自动释放
	//4、局部变量的作用域在当前的{},离开此{},无法使用此变量
	//5、{}的普通局部变量,加不加auto关键字等价,普通局部变量也叫自动变量
	//6、不同的{}中,变量的名字可以一样,可以把{}类比成一个房子,不同房子可以有同名的小伙伴
	//7、如果局部变量不初始化,它的值默认为随机值
	
	auto int tmp;//加不加auto关键字等价

	{
		int a = 10;
		{
			a = 11;//ok,还在作用域范围内
		}
	}	

	//a = 11;//err,离开作用域
/********************************************************/
	if(1)
	{
		int b = 10;

	}

	//b = 11;//err,离开作用域

/********************************************************/
	for (int i = 0; i < 10; ++i)
	{
		/* code */
	}

	printf("i = %d\n", i);//err,i是属于for语句作用域的,离开后也是无效

	return 0;
}

二、static局部变量

普通局部变量和static局部变量区别:

1、内存分配和释放

​ a)普通局部变量只有执行到定义变量的语句才分配空间

​ b)static局部变量在编译阶段(函数还没有执行),变量的空间已经分配

​ c)普通局部变量离开作用域{},自动释放

​ d)static局部变量只有在整个程序结束才自动释放

2、初始化

​ a)普通局部变量不初始化,值为随机值

​ b)static局部变量不初始化,值为0

​ c)static局部变量初始化语句只有第一次执行时有效

​ d)static局部变量只能用常量初始化

#include <stdio.h>

void fun()
{
	int i = 0;
	i++;
	printf("i = %d\n", i);
}

void static_fun()
{
	//1、在{}内部定义的变量就是局部变量
	//2、static局部变量,是在编译阶段就已经分配空间,函数没有调用前,它已经存在
	//3、当离开{},static局部变量不会释放,只有程序结束,static变量才自动释放
	//4、局部变量的作用域在当前的{},离开此{},无法使用此变量
	//5、不同的{}中,变量名字可以一样,可以把{}类比房子,不同房子可以有同名的小伙伴
	//6、如果static局部变量不初始化,它的值默认为0
	//7、static局部变量初始化语句,只会执行一次,但是可以赋值多次
	//8、static变量只能用常量初始化(注意)
	
	static int i = 0;
	i++;
	printf("static_fun i = %d\n", i);
	
	int a = 10;
	//static int j = a; //err, 使用变量a给static变量j初始化
}

void fun2()
{
	static int i = 0;
}

int main(int argc, char *argv[])
{
	static_fun();
	static_fun();
	static_fun();


	return 0;
}

在这里插入图片描述

三、普通全局变量(外部链接)

全局变量的声明和定义:

#include <stdio.h>
//1、定义一个全局变量,建议初始化
int a = 10;

//2、如果声明一个全局变量,建议加extern
extern int a;

int main(int argc, char const *argv[])
{
	
	return 0;
}

四、static全局变量(内部链接)

​ 1、static全局变量和普通变量的区别就是作用域不一样(文件作用域)
2、extern关键字只适用于普通全局变量
3、普通全局变量,所有文件都能使用,前提需要声明
4、static全局变量只能本文件使用,别的文件不能使用
5、不同文件只能出现一个全局变量的定义
6、一个文件只能有一个static全局变量的定义,不同文件间的static全局变量,就算名字相同,也是没有关系的2个变量
在这里插入图片描述

五、普通函数和static函数的区别(文件作用域)

​ 1、所以文件只能有一次普通函数的定义

​ 2、一个文件可以有一个static函数的定义

​ 3、普通函数所以文件都能调用,前提是使用声明

​ 4、static函数只能在定义所在的文件中使用

六、extern函数和static函数的区别(作用域)
1、extern函数所有文件都是调用,所有文件只能出现一次extern函数定义
2、static函数只能在定义所在的文件中调用此函数,不同文件,可以定义一次static函数

猜你喜欢

转载自blog.csdn.net/CCai_x/article/details/83894114