变量总结
变量包含:普通全局变量,静态全局变量,普通局部变量,静态局部变量等;前言
在C语言中,变量是一个有名字的,具有具体属性的一个存储单元。你可以将变量直接就理解为内存。本文对C语言中使用的各种变量进行一个总结,方便大家学习使用。一、局部变量
局部变量分为:静态局部变量、全局局部变量
1.静态局部变量
在介绍静态局部变量之前,我们先了解一个概念:静态,在C语言中我们使用关键字static来表示静态,当我们在定义变量时,一般的说在函数内部定义的变量我们称之为局部变量,在定义时对其前面加上关键字static,则此局部变量就是静态局部变量,我们举个简单的例子:
void Func()
{
static int n; //定义一个整形变量的静态局部变量n。
}
按照其字面意思,就是它的作用域只对局部有用,所以一般的说静态局部变量的作用域就是函数内部,只是在某一个块中发挥作用,而静态局部变量的生命周期是:函数进入时创建,程序退出时消亡,这里就涉及到计算机为其分配的内存区域。
当我们创建一个项目时,计算机会将欲分配的内存区域大致分为4个区域:第一个是代码区(段),第二个是全局(静态)变量区,第三个是栈,第四个是堆。而我们所定义的各种变量会按照其属性分别存放在不同的区域。就比如说,静态局部变量会存放在全局(静态)变量区,而普通局部变量会存放在栈内。
2.普通局部变量
对于普通局部变量,就是我们一般的在函数体内或者在主函数main()内部定义的变量,其作用域和静态局部变量是一样的,都只作用于某一个块内,或者说某一个函数体内。它的生命周期是:函数进入时创建,函数退出时消亡,举个简单的例子:
void Func()
{
int n; //定义一个整形变量的普通局部变量n。
}
【注】对于普通局部变量和静态局部变量来说,没有链接属性这个概念,是因为局部变量只是在函数体内作用,并不能将其通过链接扩大其作用域。
总结:对于局部变量,通俗点说就是定义在函数内部的变量,其作用域只是函数内部,退出函数体就失去其作用,若在对其进行调用程序会出错,例如:
int Sumc(int a, int b)
{
int sum; //定义一个整形变量的局部变量sum
sum = a + b; //变量a,b,sum均为局部变量,只在函数Sumc中发挥作用
return sum; //返回两个整数a,b的和
}
int main()
{
int n; //定义一个整形变量的局部变量n,只在主函数main()中发挥作用
}
如下代码,在函数体Func中定义一个局部变量sum,我们想要在主函数main中使用sum,编译器此时会报错:未定义标识符"sum"。
二、全局变量
全局变量分为:普通全局变量,静态全局变量
1.普通全局变量
全局变量,通俗的理解,就是其在全局也即整个文件中发挥作用,从其作用域理解,它在定义的时候,就必须定义在函数体外部,或者主函数的外部,对于普通的全局变量,它的生命周期是在程序运行时创建,在程序退出时消亡。
【注】对于全局变量,不论是普通全局变量,还是静态全局变量,其内存区域均在全局(静态)变量区。
2.静态全局变量
类似于静态局部变量的定义,在定义全局变量的时候在其前面加上关键字static,即为静态全局变量。对于静态全局变量,它的作用域是整个文件,生命周期是程序运行时创建,程序退出时消亡,它存储在全局(静态)变量区,举个简单的例子:
static int n = 0; //定义一个静态全局变量n,并且初始化为0,其作用域是整个文件,也就是对函数Func和main均可用
int m = 0; //定义一个普通全局变量m,并且初始化为0,其作用域是整个文件
void Func()
{
int n; //定义一个整形变量的普通局部变量n,其作用域是函数Func()内部
}
int main()
{
char str; //定义一个char类型的普通局部变量str,其作用域是主函数main()内部
}
如下代码,我们在函数体外定义一个全局变量sum,此时,可以在函数Func中使用,也可以在主函数main中使用。
三、全局变量和局部变量的比较
1.比较
生命周期 | 作用域 | 默认值 | 内存区域 | 链接属性 | |
---|---|---|---|---|---|
普通局部变量 | 函数进入时创建,函数退出时消亡 | 函数内 | 随机值 | 栈 | 无 |
静态局部变量 | 函数进入时创建,程序退出时消亡 | 函数内 | 0 | 全局(静态)变量区 | 无 |
普通全局变量 | 程序运行时创建,程序退出时消亡 | 整个文件内 | 0 | 全局(静态)变量区 | 外部 |
静态全局变量 | 程序运行时创建,程序退出时消亡 | 整个文件内 | 0 | 全局(静态)变量区 | 内部 |
2.静态关键字:static
static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性。在C语言中,关键字static主要定义全局静态变量、定义局部静态变量、定义静态函数。
static可以修改变量或者函数的声明周期,默认值,内存区域,链接属性。
举个简单的例子:
int a; //普通全局变量 程序创建时生成,程序退出时消亡 全局(静态)变量区 整个文件内 外部 默认值:0
static int b; //静态全局变量 程序创建时生成,程序退出时消亡 全局(静态)变量区 整个文件内 内部(加extern变为外部) 默认值:0
const int c = 10; //全局变量(默认为静态) 内部 程序创建时生成,程序退出时消亡
int main()
{
int d; //普通局部变量 函数(代码块)创建时生成,函数退出时消亡 函数内 栈内 默认值:随机值
static int e; //静态局部变量 函数创建时生成,程序退出时消亡 函数内 全局(静态)变量区
const int f = 20; //局部变量 函数创建时生成,函数退出时消亡 函数内
for (int i = 0; i < 10; i++) //i是局部变量 块创建时生成,块结束时消亡 块内可见
{
printf("%d\n", i);
}
return 0;
}