21、关键字具体讲解
(1)typedef
typedef顾名思义是类型定义,这里应该理解成类型重命名(只能是对类型重命名)
typedef unsigned int uint; //关键字typedef把unsigned int类型(无符号整型)重新命名为uint
int main()
{
unsigned int num = 0;
uint num2 = 1; //此时。uint等价于unsigned int,可简化使命名更加方便
return 0;
}
typedef struct Node
{
int data;
struct Node* next;
}Node; //给这个结构体类型起个新名字叫Node
int main()
{
struct Node n;
Node n2; //此处与上句命名形式完全等同
return 0;
}
(2)static--静态的
<1>修饰局部变量(改变存储位置)
static修饰局部变量的时候,局部变量出了作用域,是不销毁的。
本质上,static修饰局部变量的时候,改变了变量的存储位置。
注:实际上,在C语言中,一块儿内存会划分区域使用。内存可分为栈区、堆区和静态区。局部变量
本来是存储在栈区的,栈区内变量的特点:进入它的作用域创建,出它的作用域销毁。而被static修饰的
局部变量改变了其存储位置,存放在静态区。静态区数据的特点是出了作用域不销毁,直到程序销毁时
它才销毁。因此,static影响了变量的生命周期,使其生命周期变长,和程序的生命周期一样。
void test()
{
int a = 1; //局部变量存储在栈区的,进入它的作用域创建,出它的作用域销毁
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i<10)
{
test();
i++;
}
return 0;
}//结果是2 2 2 2 2 2 2 2 2 2
void test()
{
static int a = 1; //局部变量存储静态区,特点是出了作用域不销毁,直到程序销毁时它才销毁
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i<10)
{
test();
i++;
}
return 0;
}//结果是2 3 4 5 6 7 8 9 10 11
注:void的意思是不需要任何返回(return)
<2>修饰全局变量(改变链接属性)
不同全局变量是具有外部链接属性的,即在同一个源文件的不同c文件之间都能使用,但在使用前
要声明:extern int a;
而static修饰全局变量的时候,这个全局变量的外部连接属性就变成了内部连接属性,其它文件(.c)
就不能再使用这个全局变量了,但是在自己的.c内是可以使用的(给人的感觉就是作用域变小了)
注:全局变量是放在静态区的
<3>修饰函数(改变链接属性)
一个函数也是本来具有外部连接属性的,不同c文件之间都能使用,但在使用前要声明:
extern int Add(int x, int y);
但是被static修饰的时候,外部连接属性就变成了内部链接属性,其他文件(.c)就无法使用了。
(3)register --寄存器关键字:会 建议 将变量存放在寄存器中(因为速度更快)
电脑上的存储设备:
寄存器(集成到CPU上)
高速缓存(cache)
内存
硬盘
注:越往上,所占空间越小、速度越快、造价越高;越往下,所占空间越大、速度越慢、造价越低;
int main()
{
//寄存器变量
register int a = 3;//建议 将3存放在寄存器中
return 0;
}
22.define定义常量和宏
<1>define定义标识符常量
#define NUM 100
int main()
{
printf("%d\n", NUM);
int n = NUM;
printf("%d\n", n); //与上种方式本质上是一样的
int arr[NUM] = { 0 }; //此处NUM是个常量,是被define定义的标识符常量
return 0;
}
<2>define定义宏(宏是替换的)
#define ADD(x,y) ((x)+(y)) //它实现的功能与下面函数是一样的
//ADD:宏名 x,y:宏的参数(无类型) ((x)+(y)):宏体
//int ADD(int x, int y)
//{
// return x + y;
//}
int main()
{
int a = 10;
int b = 20;
int c = ADD(a, b); //在编译时它替换了宏体,a替换到x、b替换到y,即 int c = ((a)+(b));
printf("%d\n", c);
return 0;
}