1.4
关键字
关键字 --C语言中本身内置的,无法自己创造数据类型相关:int char float double void short long signed unsigned存储类别相关:auto static extern register控制流相关:if else switch case default for while do break continue goto return结构体、联合体、枚举相关:struct union enum类型定义:typedef常量相关:const volatile其他:sizeof
auto
int main()
{ auto int a = 10;//自动变量,作用于内部,自动于设定时创建,于最后自动销毁,//auto可以省略
printf("%d\n", a);
return 0;
}
typedef 对类型进行重命名
typedef unsigned int uint; //typedef将unsigned int 重新命名为uint
int main()
{ unsigned int num1 = 0 ;
uint num2 = 1 ; //两种初始化变量的方法效果等价
return 0;
}
/*struct Node
{ int data;
struct Node* next;
};
int main()
{ struct Node n;
return 0;
}
*/
typedef struct Node//将结构体Node重命名简化为Node,与上注释等价
{ int data;
struct Node* next;
}Node;
int main()
{ Node n1;
return 0;
}
static
1.修饰局部变量2.修饰全局变量3.修饰函数
实例--局部变量
void test() //有void不返回
{
int a = 1;
a++;
printf("%d", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
//结果十个2,a是局部变量,进入它的范围时重新创建,每次都是从1开始,出它的范围时销毁,下次调用又从1开始
void test()//void意思不需要返回值
{
static int a = 1;
a++;
printf("%d ", a);//static修饰局部变量时,局部变量出作用域不销毁,直至程序结束时候才销毁
//本质上static修饰局部变量的时候改变了变量的存储位置,存储在静态区,改变了变量的生命周期
}
int main()
{
int i = 0;
while (i < 10)
{
test();//调试F10时候想进test函数内部,按F11,进入反汇编观察,发现Line44无汇编代码,即证明执行过程中不会再创建a,会一直使用第一次创建的a,
//过程中监视发现&a的地址一直未发生变化
i++;
}
return 0;
}
结果2到11
关于存储
计算机中的存储设备硬盘:存储速度慢,断电数据不丢失,空间大,价格低内存:RAM,存储速度快,断电数据丢失,空间大,价格低缓存:存储速度快,断电数据丢失,空间小,价格高寄存器:存储速度最快,断电数据丢失,空间小,价格高
内存使用时候会划分区域进行不同使用:栈区、堆区、静态区栈区:局部变量堆区:动态内存管理 malloc/free new/delete calloc/realloc静态区:全局变量、静态变量,变量直至程序最后销毁
浮点数的四舍五入不能用肉眼看到的结果来判断,因为浮点数在计算机中是近似存储的,不是精确存储的 如12.455 在计算机中可能存储为12.45498799
实例--全局变量
源文件1
int g_val = 2025;//全局变量,具有外部链接属性
extern int g_valp;//声明外部变量,但是无法提取到g_valpx,以为它不是全局变量
int main()
{
printf("%d\n", g_valp);//2026
return 0;
}
源文件2
int g_valp = 2026;//全局变量 static int g_valpx = 2026;
//static修饰全局变量,改变了全局变量的链接属性,外部链接属性变为内部链接属性,只能在本文件中使用
实例--函数
源文件1
extern int add(int x,int y);//声明外部函数
int main()
{
int a = 10;
int b = 20;
int sum = add(a, b);
printf("sum=%d\n", sum);
return 0;
源文件2
Add(int x, int y)
{
return x + y;
}
若Add前加static,改变了函数的链接属性,外部链接属性变为内部链接属性,只能在本文件中使用
寄存器变量 register
int main()
{
register int a = 10;//寄存器变量,建议将10存储在寄存器中,速度快,但是寄存器有限,不能存储过大的数据
return 0;//计算器会自动选择存储位置,不一定存储在寄存器中
}
关于define
#define可以定义标识符常量,不是变量,是一个宏,是一个预处理指令,不会分配内存,只是简单的替换
#define NUM 100
int main()
{ printf("%d\n", NUM);
int n = NUM;
printf("%d\n", NUM);
int arr[NUM] = { 0 };//定义数组
return 0;
}
#define定义宏宏是有参数的,宏定义的时候不会检查参数类型,只是简单的替换宏名字(宏参数,宏参数) 宏体 (参数无类型)
#define ADD(x,y) ((x)+(y))
int main()
{
int a = 10;
int b = 20;
int c = ADD(a,b);
printf("%d\n", c);
return 0;
}

