变量与static关键字

一、变量

变量:在内存中开辟一段空间,存储对应的值。这个空间存储的值是可以改变的
变量声明:告诉编译器有个变量,编译器在内存中开辟一段空间,若没有赋值,则存储的值是一个随机值
变量声明语法: 类型 变量名;  如 int i;即有个变量为i, i为int类型

1.1 全局变量与局部变量

全局变量:定义在代码块 { }之外的变量
局部变量:定义在代码块 { }之内的变量

#include <stdio.h>

int s = 20; //全局变量s

void test() {
	int j = 30; //局部变量j
	printf("局部变量: j = %d\n", j);
}

int main() {
	int i = 10; //局部变量i
	{
		int z = 40; //局部变量z
		printf("局部变量: z = %d\n", z);
	}
	printf("全局变量:s = %d\n", s);
	printf("局部变量:i = %d\n", i);
	test();
	return 0;
}

输出

局部变量:z = 40
全局变量:s = 20
局部变量:i = 10
局部变量:j = 30

当全局变量与局部变量同名时,局部变量优先,所以建议名字不要相同,以免产生误会

#include <stdio.h>

int i = 20; //全局变量i
int main() {
	int i = 10; //局部变量i
	printf("i = %d\n", i); 
	return 0;
}

输出

i = 10

c++中可以通过域作用运算符::,放在变量前面,表示访问同名全局变量

1.2 变量的作用域

作用域:变量的有效范围,即变量在哪一部分代码范围内可以使用
全局变量作用域是整个项目
局部变量作用域是定义变量所在代码块{ }内

#include <stdio.h>
int main() {
	{
		int i = 10; //局部变量i只在定义代码块{ }内生效
	}
	printf("%d\n", i); //编译器会报错误,i为未声明变量
	return 0;
}

a.c文件

int num = 20;

test.c文件

#include <stdio.h>
int j = 20;
extern int num; //引用其他文件的全局变量要使用extern关键字声明,告诉编译器去其他源文件内寻找num变量
int main() {
	printf("全局变量 j = %d\n", j);
	printf("a.c文件的全局变量 num = %d\n", num);
	return 0;
}

输出

全局变量 j = 20
a.c文件的全局变量 num = 20

1.3 变量的生命周期

生命周期:变量的生命周期指的是从变量创建到变量的销毁之间的一个时间段
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
全局变量的生命周期是:整个程序的生命周期。

二、static关键字

2.1 修饰全局变量

static修饰全局变量:改变了变量的作用域,让静态全局变量只能在自己所在源文件内部使用,出了源文件就无法使用

a.c文件

static int num = 20; //使用static修饰全局变量,使之成为静态全局变量

test.c文件

#include <stdio.h>
extern int num; 
int main() {
	printf("a.c文件的全局变量 num = %d\n", num); //错误,num变量作用域只能在a.c源文件内
	return 0;
}

2.2 修饰局部变量

static修饰局部变量:改变了变量的生命周期,局部变量生命周期变长,等同于程序生命周期
,但局部变量作用域不改变

#include <stdio.h>
int test() {
	int n = 0;  //n为局部变量,进入函数n创建,出函数n变量销毁,所以调用多次,返回值也是1
	n++;
	return n;
}
int main() {
	int i = 0;
	for (i = 1; i < 10; i++)
	{
		printf("第%d次调用 n = %d\n", i, test());
	}
	return 0;
}

输出

1次调用 n = 12次调用 n = 13次调用 n = 14次调用 n = 15次调用 n = 16次调用 n = 17次调用 n = 18次调用 n = 19次调用 n = 1

使用static关键字

#include <stdio.h>
int test() {
	static int n = 0;
	n++;
	return n;
}
int main() {
	int i = 0;
	for (i = 1; i < 10; i++)
	{
		printf("第%d次调用 n = %d\n", i, test());
	}
	return 0;
}

输出

1次调用 n = 12次调用 n = 23次调用 n = 34次调用 n = 45次调用 n = 56次调用 n = 67次调用 n = 78次调用 n = 89次调用 n = 9

2.3 修饰函数

static修饰函数:改变了函数的作用域,让静态函数只能在自己所在源文件内部使用,出了源文件就无法使用

a.c文件

static int add(int x, int y){ // 使用static修饰函数,使之成为静态函数
	return x + y;
}

test.c文件

#include <stdio.h>
extern int add(int,int);
int main() {
	int result = add(3, 5); //错误,add函数作用域只能在a.c源文件内使用
	printf("%d\n", result);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值