static详解

static详解

    • static是什么?
    • static怎么用?
      • 1.修饰局部变量
      • 2.修饰全局变量
      • 3.修饰函数
    • 总结
    • C++中的static

static是什么?

static是C/C++语言中常见的一个关键字,就像int,break,while,for等一样,都属于关键字。

static怎么用?

在C语言中,static被用来修饰变量与函数。其用法概括为以下三个方面:

1.修饰局部变量

static修饰局部变量,使得局部变量成为静态局部变量。
那局部变量被static修饰前后又有什么变化呢?上代码:

void test()
{
    int i = 0; //局部变量i未被static修饰
    i++;
    printf("%d ",i);
}

static详解_第1张图片先来分析一下程序运行结果:

我们知道,itest里被定义,首先那就意味这i的作用域仅在test里,它在test外并不能被使用。而且i是在test被调用的时候被定义生成,它会随test的调用结束而被释放,换句话说也就是i的生命周期取决于test什么时候被调用,什么时候调用结束,当调用结束时,i被释放,下一次再调用test时,i仍会被定义生成,不过此i非彼i,这时候的i已经是全新的i了。所以程序运行结果自然为全1。

现在我们用static修饰一下局部变量i:

void test()
{
    static int i = 0;//局部变量i被static修饰
    i++;
    printf("%d ",i);
}

static详解_第2张图片
通过上面的对比,我们可以发现局部变量istatic修饰后(其余代码并没有发生变化),直接使得打印结果发生了变化。这是为什么?

原因在于static修饰局部变量后,使得i的生命周期变为全局变量的生命周期,直接与主程序的运行与结束挂钩。但i的作用域并没有发生变化,仍仅仅是test里。具体解释起来:第一次调用test时,局部变量i被定义且初始化为0,打印一次,test调用结束。注意注意!因为i被static修饰,虽然test结束,但i并没有被释放。第二次调用test时,因为此时这个i在上一次并没有被释放,所以此次并不进行定义及初始化,即int i = 0;被跳过,直接执行i++;结果自然打印2。后面也是一样的道理,所以程序运行结果为1-10;

上述废话总结起来就一句话:static修饰局部变量,使得局部变量生命周期变成全局变量的生命周期,但作用域不变

2.修饰全局变量

static修饰全局变量,使得全局变量成为静态全局变量

惯例,看代码:

//add.c
int g_val = 2020;
//test.c
int main()
{
	printf("%d\n",g_val);
	return 0;
}

static详解_第3张图片
现在用static修饰一下int g_val = 2020;

//add.c
static int g_val = 2020;
//test.c
int main()
{
	printf("%d\n",g_val);
	return 0;
}

被static修饰的全局变量
链接式报错……。

总结一下:static修饰全局变量,使得全局变量作用域只限于当前文件,不可被跨文件使用。

3.修饰函数

static修饰函数,使得函数成为静态函数。看代码:

//add.c
int Add(int x, int y)
{
	return x + y;
}
//test.c
int main()
{
	printf("%d\n", Add(2, 3));
	return 0;
}

static详解_第4张图片Add函数static修饰一下,我们看看结果如何:

//add.c
static int Add(int x, int y)
{
	return x + y;
}
//test.c
int main()
{
	printf("%d\n", Add(2, 3));
	return 0;
}

static详解_第5张图片
链接式报错……。

总结一下:static修饰函数,使得函数只限于当前文件使用,不可被跨文件使用。

总结

累了一天,懒得打字了……
static详解_第6张图片

C++中的static

C++中的static作用不仅具有C语言中static的特性,还有额外特性:

1.被static修饰的类成员函数不能被定义为虚函数

2.类的static成员属于类而不属于对象,即该类创建的所有对对象共享该成员

3.类中所有被static修饰的数据成员必须在类外初始化

4.类的static数据成员初始化默认值为0:因为static成员存储在静态变量区,而静态变量区内空间默认值一律为0

5.被static修饰的类成员函数仅能访问被static修饰的类成员数据与类成员函数

你可能感兴趣的:(C,c++,c语言)