关键字typedef
typedef顾名思义是类型定义,这里应该理解为类型重命名。
例:
//将unsigned int 重命名为unit_32,所以unit_32也是一个类型名
typedef unsigned int unit_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
unit_32 num2 = 0;
return 0;
}
关键字static
在C语言中,static是用来修饰变量和函数的。
1.static修饰变量
a. 函数中局部变量:
- 声明周期延长:该变量不随函数结束而结束
- 初始化:只在第一次调用该函数时进行初始化
- 记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
- 存储位置:不会存储在栈上,放在数据段
b. 全局变量
- 改变该变量的链接属性,让该变量具有文件作用域,即只能在当前文件中使用
c. 修饰变量时,没有被初始化时会被自动初始化为0
2.static修饰函数
改变该函数的链接属性,让该函数具有文件作用域,即只能在当前文件中使用
例1:修饰局部变量
//代码1
#include<stdio.h>
void test()
{
int i = 0;
i++;
printf("%d\n",i)
}
int main()
{
int i = 0;
for(i = 0;i<10;i++){
test();
}
}
运行结果:
//代码2
#include<stdio.h>
void test()
{
//static修饰局部变量
static int i = 0;
i++;
printf("%d\n",i)
}
int main()
{
int i = 0;
for(i = 0;i<10;i++){
test();
}
}
运行结果:
结论:static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
注意:
int i = 0;//变量定义,只会被初始化一次,但是可以被多次赋值。
例2:修饰全局变量
//代码1
//add.c
int g_val = 2020;
//test.c
extern int g_val;//声明变量
int main()
{
printf("%d\n",g_val);
return 0 ;
}
//代码2
//add.c
static int g_val = 2020;
//test.c
int main()
{
printf("%d\n",g_val);
return 0 ;
}
代码1正常,代码2在编译的时候会出现连接性错误。
结论:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用。
例3:修饰函数
//代码1
//add.c
int Add(int x, int y){
return x+y;
}
//test.c
extern void Add();//声明函数
int main()
{
printf("%d\n",Add(2,3));
return 0 ;
}
```c
//代码2
//add.c
static int Add(int x, int y){
return x+y;
}
//test.c
int main()
{
printf("%d\n",Add(2,3));
return 0 ;
}
代码1正常,代码2在编译的时候会出现连接性错误。
结论:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用。
# include<stdio.h>
//全局变量可以跨文件使用(需要声明)
//static修饰全局变量,该变量只能在本文件内使用
int g_val = 1234;
//函数也可以跨文件访问
//static修饰函数,该函数只能在本文件内部被使用
void show(){
printf("hello bit!");
}