目录
2.修饰全局变量:全局变量的外部连接属性变成内部连接属性,其他源文件不可再 调用此全局变量
3.修饰函数:与修饰全局变量的作用类似,消除函数的外部连接属性
C语言
注:一下所写均为新了解的知识并非整体的知识总结
C语言关键字
一、typedef:类型重命名
可以将复合型的类型进行重新定义例如:unsigned int、unsigned short、unsigned long、unsigned long long(注意:unsigned不可修饰float、double类型)和结构体等复合型变量
例1:重定义unsigned int
typedef unsigned int uint;将unsigned重定义为uint
int main()
{
uint num = 0; //直接引用uint,num就可以被定义为unsigned int类型
//与 unsigned int num = 0;等价
return 0;
}
例2:定义结构体
typedef struct Node
{
int data;
struct Node* Next;
}Node; //将结构体重定义为Node
int main()
{
Node n;//引用Node即可将n定义为结构体变量
return 0;
}
二、Static
可以调整变量或函数的作用域和生命周期,可用于修饰局部变量、全局变量和函数
(此处引用B站鹏哥C语言中的例子)
1.修饰局部变量:使得局部变量的生命周期延长至整个文件结束
①无static修饰时:
// 不加static
void test()
{
int a = 1;
a ++;
printf("%d ",a);
}
int main()
{
int i = 0;
while (i < 3)
{
test();
i++;
}
return 0;
}
输出结果:
2 2 2
说明:
-
函数test中的变量a为局部变量,每次在调用test函数时生成,调用结束后自动初始化,循环调用三次,因此会输出三个2。
②有static修饰时:
// 加入static
void test()
{
static int a = 1;
a ++;
printf("%d ",a);
}
int main()
{
int i = 0;
while (i < 3)
{
test();
i++;
}
return 0;
}
输出结果:
2 3 4
说明:
-
函数test中的变量a被static修饰后,每次调用test函数后变量a不会被初始化,而是保留上一次的值,循环调用test函数三次,因此输出为以上结果
2.修饰全局变量:全局变量的外部连接属性变成内部连接属性,其他源文件不可再 调用此全局变量
①无static修饰时:
文件1(test1.c)
int g_val = 2025;//在文件1中定义一个int类型的变量
文件2(test2.c)
extern int g_val;//声明外部变量后才能在本文件中调用其他文件中的全局变量
int main()
{
printf("%d\n", g_val);
return 0;
}
输出结果:
2025
②有static修饰时:
文件1(test1.c)
static int g_val = 2025;//将整型变量前加static进行修饰
文件2(test2.c)
extern int g_val;
int main()
{
printf("%d\n", g_val);
return 0;
}
输出结果:
说明:
- 无static修饰时,g_val是定义在文件1中的一个全局变量,可以在其他文件中声明外部变量后调用,因此可以输出数字2025.
- 有static修饰时候,g_val的作用范围被限制在了文件1中,其他文件不可调用,所以编译器会报错。
3.修饰函数:与修饰全局变量的作用类似,消除函数的外部连接属性
①无static修饰时
文件1(test1.c)
int Add(int x, int y)
{
return x + y;
}
文件2(test2.c)
extern int Add(int x, int y);//声明外部函数
int main()
{
int a = 10;
int b = 20;
int z = Add(a , b);
printf("%d\n", z);
return 0;
}
输出结果:
30
②无static修饰时:
文件1(test1.c)
static int Add(int x, int y)
{
return x + y;
}
文件2(test2.c)
extern int Add(int x, int y);//声明外部函数
int main()
{
int a = 10;
int b = 20;
int z = Add(a , b);
printf("%d\n", z);
return 0;
}
输出结果:
说明:
- 无static修饰时,在文件1中定义的函数具有外部连接属性,在其他文件中只需要声明外部函数即可调用,函数Add是将变量a,b相加的运算,因此输出结果30.
- 有static修饰时,文件1中定义的函数外部连接属性变为内部连接属性,其他文件中不可调用,因此编译器报错。
static修饰前后对比:
作用域 | 生命周期 | |
无static | 定义的函数内部 | 函数调用期间 |
有static | 定义的函数内部 | 程序运行期间 |
作用域 | 生命周期 | |
无static | 整个工程文件内部 | 程序运行期间 |
有static | 定义所在的文件内部 | 程序运行期间 |
作用域 | 生命周期 | |
无static | 整个工程文件内部 | 程序运行期间 |
有static | 定义所在的文件内部 | 程序运行期间 |