变量概述

       在编程语言中我们经常用到很多变量,比如整型变量、字符型变量、指针变量等等。那么它们都是如何区分的呢?下面我们以c语言为例,一起来看看。

         我们说变量,变量有什么特点呢?它的属性有哪些呢?变量有五大属性:生命周期、内存区域、作用域、默认值和连接属性。我们就从这五个方面来说。

        变量的可以分为四大类:(静态)全局变量、(静态)局部变量、动态内存和函数。我们分别来看。

一、(静态)全局变量

全局变量的定义:定义在函数外部的变量。

生命周期:从程序运行开始创建到程序结束时销毁。

作用域:从定义变量开始到本文件结束。

默认值:0。

内存区域:全局(静态)变量区。

链接属性:外部。

        

        静态全局变量与全局变量相比,它们的生命周期、作用域、默认值、内存区域都相同,只有链接属性不同。静态全局变量的内存区域为内部。

        连接属性,链接属性分为三种:外部链接、内部链接和无连接。

       外部链接:外部链接就是需要的函数与变量可以在外部文件中找到,我们知道一个完整的c程序可能由很多.c文件组合而成,因此当我们需要的函数和变量是其他文件来提供时,就需要在外部文件中寻找了,外部链接其实也就是跨文件访问,extern修饰的全局变量和函数就是外部链接的内容。

       内部链接:内部链接与外部链接恰恰相反,内部链接就是需要的函数和变脸量在本文件中就可以找到,对于内部链接的变量和函数,我们一般都是用static进行修饰的,一旦这些函数和全局变量用static修饰后,外部文件将无法访问,只有本文件内部才能进行访问,所以static修饰的全局变量和函数都是内部链接的。

       无链接:无连接的意思就是这个符号本身不参与链接,它跟链接没关系,比如局部变量,它就是无链接的。

#include<stdio.h>
int g_a=100;

int main()
{

	g_a=101;
	printf("%d\n",g_a);
	return 0;
}

我们定义一个整型变量g_a为100,通过上述语句将其改为101.结果如下:



在本项目内创建一个Max.cpp的文件,文件内定义一个整型变量g_b=100,在本项目的其他文件中调用g_b。

#include<stdio.h>

int main()
{
	extern int g_b;
	g_b=102;
	printf("g_b=%d\n",g_b);
	return 0;
}

我们可以看到不仅调用成功而且还可以修改g_b的值。

但是我们如果给Max.cpp文件里的全局变量g_b加了statia在其他文件中将不能访问并且修改,static int g_b=100;

         二、(静态)局部变量

局部变量的定义:定义在函数内部的变量。

生命周期:进入函数时创建,函数退出时销毁。

作用域:本函数内部有效。

默认值:随机值。

内存区域:栈(stack)。

连接属性:无。

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


int main()
{
	for(int i=0;i<5;i++)
	{
		Fun();
	}
	return 0;
}

静态局部变量:用static修饰的局部变量

生命周期:第一次进入函数时创建,程序结束时销毁

作用域:无(只要能获得该变量的地址,都能访问)。

默认值:0.

内存区域:全局(静态)变量区。

连接属性:无。

void Fun()
{
	static int a=0;
	a++;
	printf("a=%d\n",a);
}


int main()
{
	for(int i=0;i<5;i++)
	{
		Fun();
	}
	return 0;
}


三、动态内存

动态内存的定义:点击打开链接

生命周期:调用动态内存创建函数时创建,调用内存释放函数时销毁(free)。

作用域:无(只要能获得其首地址,都能够使用)。

默认值:用malloc创建动态内存时默认值为随机值,用calloc创建动态内存时默认值为0。

内存区域:堆(heap),(注意内存泄露的问题)。

连接属性:无。

动态内存详细内容请阅读文章《动态内存》点击打开链接


四、函数

函数分为内部函数和外部函数,用static修饰的函数为内部函数,无static修饰的函数为外部函数。

内存区域:代码段。

链接属性:内部函数的链接属性为内部,外部函数的链接属性为外部。

外部函数:如果在主函数页中想调用外部函数,必须在主函数页中添加头文件(在此头文件中对该函数有过声明)。




猜你喜欢

转载自blog.csdn.net/Pluto_God/article/details/80293943