15-关键字typedef和static

15-1 typedef

顾名思义是类型定义,这里应该理解为类型重命名

typedef unsigned int uint;
int main()
{
	unsigned int num = 0;
	uint num2 = 1;  //unit相当于unsigned int
	return 0;
}

再比如:

struct Node
{
	int data;
	struct Node* next;
};
int main()
{
	struct Node n;
}

相当于:

typedef struct Node
{
	int data;
	struct Node* next;
}Node;
int main()
{
	Node n;
}

15-2 static

在C语言中,static是用来修饰变量和函数的

15-2 -1 修饰局部变量-称为静态局部变量

考虑以下代码的结果:

void test()
{
	int a = 1;
	a++;
	printf("%d ",a);
}
int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

结果如下:

 while循环里循环了10次,每一次a都初始化为1后再加1(a是局部变量)

如果在a前加上static呢?

void test()
{
	static int a = 1;
	a++;
	printf("%d ", a);
}
int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

结果如下:

解释:static修饰局部变量的时候,局部变量出了作用域不销毁。本质上,static修饰局部变量的时候,改变了变量的存储位置

实质:存储位置的改变。本来,局部变量是存放在栈区的,但是被static修饰后,变量是存储在静态区的,成为了静态变量。静态变量出作用域是不销毁的,直到程序运行结束后才销毁。

也可以理解为,static影响了变量的生命周期,变量的生命周期变长了,跟程序的生命周期一样

注意:这里的“改变了变量的存储位置”,是指普通的局部变量存放在栈区,静态变量存放在静态区

调试展示

鼠标放在int main()那一行,F10进行调试

到达test()那一行按F11进入test函数

继续F10

鼠标放在static int a = 1那一行,右键点击“转到反汇编”

发现static int a = 1对应的没有汇编代码,即不参与执行

观察a的变化:地址没有变化 

 

void

不需要返回

void test()
{
	//执行任务,没有返回
	printf("Hello World!");
}
int main()
{
	test();
	return 0;
}

结果: 

15-2-2 修饰全局变量-称为静态全局变量

新建立一个源文件:add.c

在test.c中:

//声明外部符号
extern g_val;
int main()
{
	printf("%d\n", g_val);
	return 0;
}

在add.c中:

//全局变量
int g_val = 2024;

成功打印:

如果在全局变量前加上static呢?

即更改add.c为:

//全局变量
static int g_val = 2024;

出现错误!

 

为什么呢?

解释如下:

1、全局变量是具有外部链接属性的,所以其他的源文件可以使用该局部变量

(文件:编译+链接-->可执行程序)

2、static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性,其他的源文件就不能再使用到全局变量了

3、你会感到作用域变小了

15-2-3 修饰函数-称为静态函数

与静态全局变量相似:

add.c中:

int Add(int x, int y)
{
	return x+y;
}

test.c中:

//声明
extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int c = Add(a,b);
	printf("%d\n", c);
	return 0;
}

成功运行:

如果在函数前加上static呢?

即:

static int Add(int x, int y)
{
	return x+y;
}

与前面类似,出现错误:

 解释:

一个函数本来是具有外部链接属性的,但是被static修饰的时候,外部链接属性就变成了内部链接属性,其他源文件(.c)就无法使用这个函数了

15-3 register(寄存器)

电脑上的存储设备都有哪些?

从下到上:硬盘、内存、高速缓存(cache)、寄存器(集成到CPU上)

特点:

越往上,访问读写速度越快;

上面:空间小,造价高;

下面:空间大,造价低。

CPU:中央处理器(负责计算)

起初:从内存里面拿数据,CPU来计算

随着CPU设计的不断精进,CPU的计算能力速度变得非常快,但是硬件的速度提升得慢,造价高,导致内存跟不上CPU的速度,这时候高速缓存和寄存器就参与进来了。这两个造价高,那么数量就设置得少一点

数据的传递:内存->高速缓存->寄存器

只要保证大部分数据在寄存器中,CPU的处理速度、计算机的性能都得到了提升

int main()
{
	//寄存器变量
	register int a = 3;  //建议:3存放在内存器中
	return 0;
}

注:这里只能是建议。试想,如果每个人都觉得自己的数据重要,都想要放在寄存器中,哪里有那么多寄存器可以存呢?所以只能是提出建议,不能保证,最后还是要编译器来决定

后续会对register的使用进行详细讲解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值