static的作用非常的大,在实际应用中经常出现,因此,也常常作为面试官的面试题之一。
它的用处,在其他地方均可找到,本文不再累赘,但是,具体是如何实现以上的作用呢?
本文通过下面的例子,给大家介绍这个staic的常规用法:
代码部分:
#include <stdio.h>
/*
*static ,常常使用在两种情况下:变量和函数
* 1.变量:static定义的变量不会在函数重新进入时再次赋初值;不会在函数结束时而释放(存储在全局区);不会在循环中多次赋初值
* 2.函数:static定义的函数只能在本文件中调用,不能在其他文件中调用
*/
void test_call(void);
static int test_func_call_1(void);
int main()
{
int flag1 = 0;
int flag2 = 0 ;
int times = 10;
/*in a while circle, the variable of i defined by static int don't change to be the initial value*/
while(times--)
{
static int i = 1; //while循环中,并没有多次赋初值,仅仅有第一次的赋初值操作
if(i == 1)
{
flag1 += 1;
printf("flag1 = %d \n",flag1);
}
i = i+1; //可以进行赋值操作(赋值与赋初值不同)
if(i >= 2)
{
flag2 += 2;
printf("flag2 = %d \n",flag2;
}
}
/*test:the variable in a function call*/
times =5;
while(times--)
{
test_call(); //多次调用函数;但是,不会多次对static的变量赋初值
}
/*test: call the function declared by static in different file */
test_func_call_1(); //it can be called because in the same file, but it can't be invoke by the function in other files
//invoke a static int function in other file
//无法调用,编译时汇报没有定义。(毕竟static了,只对内部文件可见)
//test_func_call_2(); //undefined!
//invoke an int function in other file
//这个函数并不是staic的,是可以调用的(只要是一起编译,或者是添加头文件,添加声明)
test_func_call_3();
return 0;
}
void test_call(void)
{
static int flag3 = 1; //并不会每次进来都赋初值为1,只执行第一次
if(flag3 == 1)
{
printf("I am in flag3 == 1!\n");
flag3++; //it changes 仍然能够进行其他的赋值操作
}
else
{
printf("I am not in flag3 == 1!!!\n");
}
}
static int test_func_call_1(void)
{
printf("It is a static function call...\n");
}
#include <stdio.h>
/*it can't be invoked by other files*/
//它并不能被其他文件的函数调用,只能给同一文件的函数调用
static int test_func_call_2(void)
{
printf("I am in other file!\n");
return 0;
}
//此函数将给外部函数调用
int test_func_call_3(void)
{
/*but it can be called by the func in the same file*/
//在本文件中,调用static文件,可行
test_func_call_2();
return 0;
}
出错,如果直接调用static的函数:
运行结果:
结果分析:
①尽管调用多次static int,但flag1仅出现一次,表明仅完成一次赋初值操作;
②flag2出现不同的值,说明,static int的变量能够进行改变值的操作,自加,自减,赋值(不同于定义时候的赋初值)都行。
③flag3部分仅进入一次,理由同①,只不过是函数调用而已;
④static的函数想要调用,必须在其同文件下,创建一个调用static函数的常规的函数,然后在另外一个文件下调用这个常规函数。
谢谢大家~
如若有问题,欢迎讨论~