招聘网站入职分析表怎么做,50000免费短视频素材,个人博客网站,一个服务器做两个网站C语言中static关键字用法 2021年7月28日席锦 static关键字在c语言中比较常用#xff0c;使用恰当能够大大提高程序的模块化特性#xff0c;有利于扩展和维护。但是对于c语言初学者#xff0c;static由于使用灵活#xff0c;并不容易掌握。 变量 1.局部变量 普通局部变量是再… C语言中static关键字用法 2021年7月28日·席锦 static关键字在c语言中比较常用使用恰当能够大大提高程序的模块化特性有利于扩展和维护。但是对于c语言初学者static由于使用灵活并不容易掌握。 变量 1.局部变量 普通局部变量是再熟悉不过的变量了在任何一个函数内部定义的变量不加static修饰符都属于这个范畴。编译器一般不对普通局部变量进行初始化也就是说它的值在初始时是不确定的除非对其显式赋值。 静态局部变量使用static修饰符定义即使在声明时未赋初值编译器也会把它初始化为0。 实例程序: #include stdio.hint main(void)
{int a, b;static int c, d;_asm int 3 // 中断在调试模式下查看a,b,c,d的值。可以看到a,b的值与c,d的值不同printf(%d, %d, c, d); // 不加这一句无法在中断时查看到c,d的值。注意a,b未初始化不能使用return 0;
}F5调试信息: 普通局部变量存储于进程栈空间使用完毕会立即释放。 静态局部变量存储于进程的全局数据区即使函数返回它的值也会保持不变但是其作用域为局部作用域当定义它的函数结束时其作用域随之结束。 实例程序: #include stdio.h
void fun(void)
{int n_1 10;printf(n%d\n, n_1);n_1;printf(n%d\n, n_1);
}
void fun_static(void)
{static int n_2 10;printf(static n%d\n, n_2);n_2;printf(n%d\n, n_2);
}
int main(void)
{// 普通局部变量使用完毕会立即释放fun();printf(\n);fun();printf(--------------------\n);// 静态局部变量即使函数返回它的值也会保持不变fun_static();printf(\n);fun_static();//printf(static n%d\n, n_2); // 打开本行语句编译就无法通过因为变量n_2的作用域仅在fun_static()函数内return 0;
}运行截图: 2.全局变量 全局变量定义在函数体外部在全局数据区分配存储空间且编译器会自动对其初始化。 普通全局变量对整个工程可见其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。 静态全局变量仅对当前文件可见其他文件不可访问其他文件可以定义与其同名的变量两者互不影响。 在定义不需要与其他文件共享的全局变量时加上static关键字能够有效地降低程序模块之间的耦合避免不同文件同名变量的冲突且不会误使用。 实例程序: /* demo.h */
#include stdio.h/* demo.c */
#include demo.hstatic int itest; // 在demo2.c中也有一个一模一样的定义但是程序编译运行正常
extern int itest2; // 若是去掉extern将编译失败int main(void)
{printf(hello world.\n);return 0;
}/* demo2.c */
#include demo.hstatic int itest;
int itest2;运行截图: 函数 函数的使用方式与全局变量类似在函数的返回类型前加上static就是静态函数。其特性如下 1)静态函数只能在声明或定义它的文件中可见其他文件不能引用该函数 2)不同的文件可以使用相同名字的静态函数互不影响 非静态函数可以在另一个文件中直接引用甚至不必使用extern声明 实例程序: /* demo.h */
#include stdio.h
static void fun1(void);
static void fun2(void);
void callFun2(void);/* demo.c */
#include demo.hstatic void fun1(void)
{printf(hello from demo fun1.\n);
}int main(void)
{fun1(); // 静态函数定义在本文件中可以直接调用//fun2(); // 打开注释将无法编译通过。原因:函数fun2()是静态函数且不在本文件中声明或定义callFun2(); // 非静态函数可以在另一个文件中直接引用return 0;
}/* demo2.c */
#include demo.h
static void fun2(void)
{printf(hello from demo fun2.\n);
}void callFun2(void)
{fun2(); // 静态函数定义在本文件中可以直接调用
}运行截图: