C语言-static关键字-创新互联

目录

创新互联建站是一家专注于成都做网站、网站设计与策划设计,炎陵网站建设哪家好?创新互联建站做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:炎陵等地区。炎陵做网站价格咨询:18980820575

static修饰局部变量

static修饰全局变量

static修饰函数


static关键字既可以修饰变量,也可以修饰函数,那么修饰后与修饰前有什么不同呢?下面分别从这两方面进行讲述。

static修饰局部变量

先上结论:static修饰局部变量会更改局部变量的生命周期使其拥有全局生命周期,但作用域并不会改变。

  如何去证明它?我们看下面一段代码:

#includevoid fun()
{
	int i = 0;
	i++;
	printf("%d\n", i);
}
int main()
{
	for (int i = 0; i< 10; i++)
	{
		fun();
	}
	return 0;
}

在没有static修饰变量i时,最后的结果为10个1,因为i在函数内部创建,每次函数调用时创建,函数结束时销毁。当我们加上了static关键字后

#includevoid fun()
{
	static int i = 0;
	i++;
	printf("%d\n", i);
}
int main()
{
	for (int i = 0; i< 10; i++)
	{
		fun();
	}
	return 0;
}

结果就变成了1到10,static让变量i拥有全局生命周期并且static int i = 0只会执行一次,后面再执行fun函数不会再执行这句话。

  那如何证明作用域没有改变呢?

  还是上面的变量i,它的作用域是函数体内部,函数体外面是访问不到的,我们可以尝试在main函数中打印变量i

发现不能找到,所以作用域并没有改变。

static修饰全局变量

  还是先上结论:static修饰的全局变量不能在文件外部访问,把其外部链接属性修改为内部链接属性。

  正常情况下,我们在一个文件中定义的全局变量,在另一个文件中声明了即可访问

//我是一号文件
int a = 10;
//我是2号文件
#includeextern int a;
int main()
{
	printf("%d", a);
	return 0;
}

当我们给1号文件中的变量a加上static修饰后,运行发现2号文件报错

所以static修饰的全局变量不能跨文件访问,但是2号文件就不能访问了吗?

虽然不能直接访问,但是我们可以间接访问

//我是一号文件
 int a = 10;
 int* p = &a;
 void change()
 {
	 a++;
	 printf("%d", a);
 }
//我是2号文件
#includeextern int a;
extern int* p;
int main()
{
	(*p)++;
	printf("%d\n", *p);
	change();
	return 0;
}

最后打印的结果为11和12

static修饰函数

  先上结论:static修饰函数会减少函数的作用域,使函数只能在本文件中访问

正常情况下,函数即使不声明也可以在别的文件中访问,就如同上面的嫦娥函数,我并没有声明,依然可以访问。

还是上面的代码,我们给change函数前面添加static关键字后,发现编译器就会报错

但它与static修饰的全局变量一样,虽然无法直接访问,却可以通过文件内的其他函数暴露一个接口去访问.

//我是一号文件
 int a = 10;
 int* p = &a;
 static void change()
 {
	 a++;
	 printf("%d", a);
 }

 void jiekou()
 {
	 change();
 }
//我是2号文件
#includeextern int a;
extern int* p;
int main()
{
	(*p)++;
	printf("%d\n", *p);
	jiekou();
	return 0;
}

打印出来依然是11和12。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站题目:C语言-static关键字-创新互联
分享地址:http://myzitong.com/article/dhjdoi.html