一。关键字
1. typedef
顾名思义:类型重命名
作用:简化书写
作用对象;数据类型
typedef unsigned int uint; struct Node { int date; struct Node* next; }Node; //类型重命名 int main() { unsigned int a=10; uint a=10; struct Node* Phead; Node* Phead; {
2.static
- static,顾名思义:静态
- 修饰的变量称为静态变量
- 修饰局部变量
- 修饰全局变量
- 修饰函数
2-1 修饰局部变量
void show() { static int i = 1;//只初始化一次 i++; printf("%d ", i); } int main() { int i = 0; while (i < 10) { show(); i++; } }
运行结果:
反汇编看statia修饰的局部变量:
总结static修饰的局部变量的效果:
- static修饰的局部变量出了作用域不消毁,实际了是改变了局部变量的存储位置.
- 影响了变量的生命周期,生命周期延长至程序的生命周期
拓展:变量存储位置
2-3修饰全局变量
下面的代码涉及:
- 多文件(多个源文件和一个头文件)的使用
- extern:多文件使用全局变量或函数的声明,告知编译器其他文件已定义该 变量或函数,但此处为声明,不能赋值
总结static修饰的全局变量作用:
- 改变全局变量的作用域,仅限定在本文件内使用
- 防止多文件的变量与其重名引发的问题
- 防止被随意更改,安全性提高
2-3修饰函数
函数也有外部链接属性,该处和static修饰的全局变量极度相相似,这里不过多介绍
3.register
电脑的存储设备:
寄存器(集成到CPU上)
高速缓存(cache)
内存
硬盘
rigister修饰的变量的特点:
- 尽量定义到寄存器中,优点:快
- 常被定义到被经常被打印的局部变量中,优点:利用率高且占时少
- 可能被定义到寄存器中,因此不可对变量取地址,原因:寄存器中变量无地址
4.define
替换,注:其非关键字
4-1定义标识符常量
#define NUM 2022 int main() { printf("%d\n", NUM); int n = NUM; int arr[NUM] = { 0 }; return 0; }
4-2定义宏
#define ADD(x,y) x+y int main() { int a = 10; int b = 20; int c = ADD(a, b); printf("%d\n", c); }
简单解释宏:
二.指针
1-1内存
- 内存会划分为一个个内存单元(一个内存单元是一个字节:1byte)
- 每个内存单元都有一个编号
bit 比特位(1byte=8bit)
byte 字节 (1kb=1024byte)
KB (1MB=1024KB)
MB (1GB=1024MB)
GB (1TB=1024GB)
TB (1PB=1024TB)
PB
为什么 一个内存单元是一个字节:一个比特位忒小,一个KB忒大
int a=10; //向内存申请4个字节的空间,
%p和%x打印的区别:
%p全部(包括0)打印出来,按地址打印
%x部分(不包括0)打印出来,按数值打印
int a=10; int* p=&a; p拿到的是存放变量a的四个字节的内存的首字节的地址
*p:解引用操作符,意思是通过p中存放的地址,找到p所指向的对象(内容)
1-2指针的大小
int main() { printf("%d\n", sizeof(char*)); printf("%d\n", sizeof(short*)); printf("%d\n", sizeof(int*)); printf("%d\n", sizeof(float*)); printf("%d\n", sizeof(double*)); return 0; }
不管什么类型的指针,都是在创建变量
指针变量是用来存放地址的
指针变量的大小却决于一个地址存放的时候需要多大的空间
32位的机器:32bit位地址—>4byte , 所以指针变量的大小是4个字节
64位的机器:64bit位地址—>8byte , 所以指针变量的大小是8个字节
64位计算机: