网站设计首页,建设部网站施工合同范本,一学一做短视频网站,自己有网站做app吗目录 前言 一、static是什么#xff1f; 二、什么时候会用到static 三、static特征介绍 1、修饰局部变量 2、修饰全局变量 3、修饰函数 四、补充 总结 一、static是什么#xff1f; static 是 C/C 中很常用的修饰符#xff0c;它被用来控制变量的存储方式和可见性。 二、什… 目录 前言 一、static是什么 二、什么时候会用到static 三、static特征介绍 1、修饰局部变量 2、修饰全局变量 3、修饰函数 四、补充 总结 一、static是什么 static 是 C/C 中很常用的修饰符它被用来控制变量的存储方式和可见性。 二、什么时候会用到static 1在修饰变量的时候static 修饰的静态局部变量只执行初始化一次而且延长了局部变量的生命周期直到程序运行结束以后才释放。2static 修饰全局变量的时候这个全局变量只能在本文件中访问不能在其它文件中访问即便是 extern 外部声明也不可以。3static 修饰一个函数则这个函数的只能在本文件中调用不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区包括全局静态变量和局部静态变量都在全局数据区分配内存。初始化的时候自动初始化为 0。4不想被释放的时候可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用 static 修饰。5考虑到数据安全性当程序想要使用全局变量的时候应该先考虑使用 static。 三、static特征介绍
1、修饰局部变量 在开始认识static之前可以先运行一下下面两个代码结果。 示例一
#includestdio.h
void test()
{int a 1;a;printf(%d , a);
}int main()
{int i 0;while (i 10){test();i;}return 0;
} 示例二
#includestdio.h
void test()
{static int a 1;a;printf(%d , a);
}
int main()
{int i 0;while (i 10){test();i;}return 0;
} 两者得到的结果是不样的第一个结果运行出来的是十个2这是因为每次重复时test()里的a都会被重新创建接着被销毁经过a以后会输出一个2而第二个结果在运行的时候在创建完毕以后不会销毁保留a的值直到程序销毁。 2、修饰全局变量
//创建一个新的.c文件
//设置全局变量
int g_val1 2023;
static int g_val2 2022;
#includestdio.h
#include add.h
extern int g_val1;
extern int g_val2;
int main()
{printf(%d\n, g_val1);//g_val12023//如果输出的是 g_val2错误return 0;
} g_ val1 成功输出 g_val2 输出时报错 全局变量是具有外部链接属性的所以在输出g_val1 的时候结果会输出2023。 这个时候我们给g_val2加上static这个时候就会看见编译器报错。这是为什么呢 static 修饰全局变量的时候这个全局变量的外部链接属性就变成了内部链接属性。其他源文件.c就不能再使用到这个全局变量了。 3、修饰函数
//创建一个新的.c文件
int add(int x, int y)
{return x y;
}
//创建一个新的.c文件
static int Add(int x, int y)
{return x y;
}
#includestdio.h
extern int add(int x, int y);
int main()
{int a 10;int b 20;int z add(a, b);printf(%d\n, z);return 0;
} 引用全局变量 引用 static 的全局变量 在使用add()函数的时候会编译成功并打印出结果30。 在使用Add()函数的时候编译器就会报错。 在static修饰函数的时候也是和修饰全局变量的时候是一样的。 一个函数本来是具有外部链接属性的但是被static修饰的时候就变成了内部链接属性。其他源文件.c就无法使用了。 四、补充 static会保留当前放入数据的值直到程序运行结束也就是说static会改变该变量的使用周期使其延长到程序结束。普通变量的创建一般是放在栈上进行的一旦给普通变量加上static这个变量就成了静态变量存放到静态区。以下就是关于栈区和静态区的特点。 栈区存放局部变量 特点进入它的作用域创建出它的作用域就销毁了 静态区静态变量 特点程序销毁才销毁 五、代码 因为在测试的过程中发现了一些问题所以把完整的代码拿出来方便动手实践与测试。小编遇到的问题会以/* */ 的方式注释出来其实也没有很多处。 添加一个名为add.h的头文件。 //设置全局变量
int g_val1 2023;
static int g_val2 2022;int add(int x, int y)
{return x y;
}static int Add(int x, int y)
{return x y;
} #includestdio.h
#include add.h/*引用头文件不然无法使用里面的函数或者全局变量*/
void test1()
{int a 1;a;printf(%d , a);
}void test2()
{static int a 1;a;printf(%d , a);
}extern int g_val1;/*使用extern 需要指定变量类型*/
extern int g_val2;
extern int add(int x, int y);int main()
{//局部变量int i 0;while (i 10){test1();i;}printf(\n);int j 0;while (j 10){test2();j;}//全局变量printf(\n);printf(%d\n, g_val1);//g_val12023g_val2错误//printf(%d\n, g_val2);//修饰函数int a 10;int b 20;int z add(a, b);//int y Add(a, b);printf(%d\n, z);//printf(%d\n, y);return 0;
}