【C++】局部变量、全局变量、静态变量与动态对象的性质
【fishing-pan:https://blog.csdn.net/u013921430转载请注明出处】
概述
局部变量 |
在一个函数内部定义的变量(包括函数形参)是局部变量。 |
|
全局变量 |
在函数外定义的变量是局部变量。 |
|
静态变量 |
静态全局变量 |
在全局变量前加static修饰。 |
静态局部变量 |
在局部变量前加static修饰。 |
|
动态对象 |
程序在运行过程中动态申请内存的对象(new、malloc) |
内存区 |
所存放对象 |
创建时期 |
销毁时期 |
栈内存 |
局部非静态对象 |
运行到该程序块时分配内存 |
离开程序块时销毁 |
静态内存 |
局部静态对象、类的static成员、所有定义在函数体外的对象 |
编译时分配内存 |
程序结束时销毁 |
堆内存 |
动态对象 |
运行到该程序块时分配内存 |
显式地销毁 |
局部变量
在一个函数内部定义的变量(包括函数形参),它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的,这种类型的变量就称为“局部变量”。
局部变量存储在栈内存,在函数结束后自动销毁。
全局变量
在函数体外定义的变量,可以为本源文件中其它函数所公用,有效范围为从定义变量的位置开始到本源文件结束,这种类型的变量就称为“全局变量”。全局变量存储在静态存储区域(静态内存)。
全局变量可以被同一工程项目中其他文件用extern声明后调用,对其每次进行修改都会被保存。
静态变量
静态全局变量
静态全局变量就是在原先的全局变量前面加上了static进行修饰。静态全局变量依然存储在静态存储区。跟全局变量最大的不同在于,静态全局变量不能被其他源文件使用,只能被本源文件使用,对其每次进行修改都会被保存。
静态局部变量
静态局部变量就是在原先的局部变量前面加上了static进行修饰。静态局部变量是静态变量因此存储在静态存储区内,等到整个程序结束才会被销毁。但是它的作用域依然在函数体内部。但是自从静态局部变量被定义后,每次对其进行修改都会被保存下来。
动态对象
动态对象是程序运行时分配的对象,例如使用new和malloc分配的对象,这部分对象的生存期由程序来控制,也就是说,动态对象需要我们手动的进行销毁(使用delete和free进行销毁)。动态对象存储在堆区。
示例程序
#include <iostream>
using namespace std;
int global = 100; //全局变量
static int sta_global = 99; //静态全局变量
int P_fun(int **p)
{
int local = 98; //局部变量;
static int sta_local = 97; //静态局部变量
(*p) = new int[10]; //动态对象;
for (int i = 0; i < 10;)
{
(*p)[i++] = i;
}
sta_global--;
global--;
cout << "local is" << local << endl;;
cout << "sta_local is" << sta_local << endl;
cout << "sta_global is" << sta_global << endl;
cout << "global is" << global << endl;
return sta_local--;
}
void main()
{
int *Point;
int times = P_fun(&Point);
cout << Point[0] << " " << endl;
cout << endl << endl;
delete Point; //释放内存;
times = P_fun(&Point);
cout << Point[0] << " " << endl;
cout << endl << endl;
delete Point;
times = P_fun(&Point);
cout << Point[0] << " " << endl;
cout << endl << endl;
delete Point;
system("pause");
return;
}
程序运行结果
从上面的结果可以看出,每次调用P_fun( )后,全局变量,静态全局变量,静态局部变量的值都改变。。而局部变量却没有改变,原因就是在退出P_fun( )后,这些变量没有被销毁,而是被保存了下来。局部变量每次都进行了重新定义,每次的值都是一样的。
已完。。
上一篇: vue-cli过滤器filter全局引入
下一篇: 用PHP写的一个冒泡排序法的函数简单实例