其他
深入理解静态变量
数据存储:
已初始化的存储在数据区中的已初始化变量区。
未初始化的存储在数据区中的未初始化变量区。
作用域:文件作用域。
本质:是受编译器按语法约束的全局变量。
作用:私有化某些变量和方法,以文件为单位对源码进行控制和管理。
生命周期:从所处模块装载到所处模块卸载。
#include <stdio.h>
#include <stdlib.h>
static int g_nTest = 0x996;
int main()
{
printf("%p\r\n",&g_nTest);
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int GetInt()
{
printf("Hello world!");
return 0x996;
}
int nTest1 = GetInt();
int main()
{
system("pause");
return 0;
}
编译器控制跨文件访问:限制导出
static char* msg = "Hello";
char* GetMsg()
{
return msg;
}
printf("%s\r\n",GetMsg());
#include <stdio.h>
#include <stdlib.h>
static int g_nTest = 0x996;
int g_nTest2 = 0x123;
void printFun();
int main()
{
printFun();
//printf("%p\r\n",&g_nTest2);
system("pause");
return 0;
}
#include <stdio.h>
extern int g_nTest2;
void printFun()
{
printf("%x\r\n",(&g_nTest2)[-1]);
}
数据存储:
已初始化的存储在数据区中的已初始化变量区。
未初始化的存储在数据区中的未初始化变量区。
作用域:与所在函数作用域相同。
生命周期:与全局静态变量相同。
作用:局部静态变量可以在过程或函数重复运行的时候保留上次运行的值。
#include <stdio.h>
#include <stdlib.h>
void TestLocal()
{
static int nTest1 = 0x996;
printf("%d\r\n",nTest1);
}
int main()
{
TestLocal();
system("pause");
return 0;
}
void TestLocal()
{
{
static int nTest1 = 0x996;
printf("%d\r\n",nTest1);
}
}
变量名
作用域名
作用域的层级编号
局部静态变量只能被赋一次初值的原因
static int snTest = 999;
局部静态变量初始化为常量的值
局部静态变量初始化为变量的值
void fooD(int n)
{
static int nTest = n;
}
如何判断静态局部变量是否被赋初值
#include <stdio.h>
#include <stdlib.h>
void TestLocal(int n)
{
static int nTest2 = n;
printf("%p:",&nTest2);
printf("%d\r\n",nTest2);
(&nTest2)[1] = 0;
nTest2++;
}
int main()
{
TestLocal(10);
TestLocal(20);
TestLocal(30);
system("pause");
return 0;
}
致谢
看雪ID:flag0
https://bbs.pediy.com/user-873556.htm
推荐文章++++
好书推荐