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的使用进行详细讲解