C/C++ 关于static

C/C++ 关于static

static关键字在c/c++中的作用无非修饰三种类型。

  • 修饰局部变量
  • 修饰全局变量
  • 修饰函数

1、static修饰局部变量

被static修饰过得局部变量,叫做静态局部变量,只会被赋一次初值,系统会把该变量在静态存储区开辟一块空间。不像一般的变量,开辟在堆栈区,系统用完就把空间释放了,但是static修饰过的局部变量,程序调用完不会立刻释放。会等到程序执行完再释放。但其作用域并不会改变,但是其生命周期会延长至程序结束

首先看静态局部变量只会被赋值一次
#include<stdio.h>
void test1()
{
	static int a=10;
	int b=10;
	printf("a=%d\n",a);
	a++;
	
	printf("b=%d\n",b);
	b++;
}
int main()
{
	for(int i=0;i<4;i++)
	{
		test1();
	}
	
}

程序运行结果如下图:

在这里插入图片描述

由图一结果发现,静态局部变量只会被初始化一次。


下面再看静态局部变量的生命周期延长了,但是作用域并没有改变。

由图二发现报错,说明静态局部变量作用域未被改变。

但是怎么查看其生命周期有没有改变呢;看下边代码。

#include<stdio.h>
int *p=NULL;
int *q=NULL;
void test1()
{
	static int a=10;
	int b=9;
	
	p=&a;
	q=&b;
}
int main()
{
	test1();
	printf("a=%d\n",*p);
	printf("b=%d\n",*q);
}

执行结果:

在这里插入图片描述

再看执行结果发现a的值没有改变,而b的值已经发生了改变。这是因为a变量被static修饰了,其地址空间并没有被释放,其它变量不能占用这一块空间,而反观b,其地址空间已经被释放了,所以其它变量可以占用这一块地址空间,因此b的值发生了改变。


还有关于static修饰类成员变量、结构体成员变量,其实和局部变量原理一样。

大家可以参考一下这篇文章:

https://blog.csdn.net/z_x_m_m_q/article/details/82502162



2、static修饰全局变量

static修饰的全局变量,其作用域被改变了,如果全局变量不被static修饰,那么这个全局变量可以在其它文件里面使用,但是加上static关键字,那么这个变量就不可以在其它文件中使用了。但是它的生命周期不会发生改变。

//文件1
#ifndef _EXP_H_
#define _EXP_H_
#include<stdio.h>
void print();
#endif

//文件2
#include"exp.h"
int overall=100;		//对比量
static int ovErall=200; //被测量
void print()
{
	printf("66\n");	
}

//文件3
#include<stdio.h>
#include"exp.h"
extern int overall;
extern int ovErall;
int main()
{
	printf("overall=%d\n",overall);
	printf("ovErall=%d\n",ovErall);//注释掉此行程序不报错
}

在这里插入图片描述
在这里插入图片描述



3、static修饰函数

static修饰函数与修饰全局变量效果一样
//文件1
#ifndef _EXP_H_
#define _EXP_H_
#include<stdio.h>
void print1();
static void print2();
#endif

//文件2
#include"exp.h"
void print1()
{
	printf("66\n");	
}
static void print2()
{
	printf("99");
}

文件3
#include<stdio.h>
#include"exp.h"
int main()
{
	print1();
	//print2(); //注释掉此行函数正常运行,否则报错。
}

运行结果:

在这里插入图片描述

仅供学习参考,欢迎批评指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值