全局变量和局部变量
全局变量:构建完成后 值不会再变 再次打开依然不变 CE为绿色
局部变量:每次构建值都是不同的 CE中为黑色 是函数内部申请的
函数不执行 局部变量没有空间 只能在函数内部使用
其他函数无法使用局部变量 因为一旦该函数执行完 局部变量就消失了
C语言的结构体 类似于面向对象语言的类
提高程序效率的两个方法:
字节对齐:数据存储的地址必须是数据长度的整数倍 (int 4字节 地址必须是8的整数倍)
如果是结构体 则以其中最宽的成员为起始位置
本机宽度:char类型数据单字节 要存储11个char 则会开辟12个字节来存储数据 4的倍数 运算更快
指针类型:
任何类型加上 “ “ 就是指针类型
指针的宽度 无论什么类型 无论几个 永远都是四个字节
当指针类型进行增、减时 增、减的长度为 砍掉一个星后数据的长度加的数
举例:char** 进行增 砍掉一个星为char 为指针类型 长度为4 所以自增量为4
char* 砍掉一个星为char 长度为1 所以自增量为1
指针类型 可以加减 不能乘除(编译约定 否则会编译报错)
指针可以进行比较 指针是无符号数 所以使用jba指令
全局变量 地址早已分配好 始终不变 直接压栈 当成立即数! 一般汇编使用PUSH
局部变量 地址是不确定的 所以要根据EBP寻址后放入EAX再压栈 汇编中存入缓冲区 EBP-4x
& 取地址符 返回结果加一个*
- 取值运算符 使用对象必须是指针类型 返回结果是值 去掉一个*
字符串定义格式:char* x = “ABCDE”;
x为指针 指向存储“ABCDE”的常量区
数组指针:
//int* p2 = arr; //int* 指针类型
//int* p3 = (int*)&arr; //int(*)[10] 数组指针类型
int(*px1) [5]; //1维数组指针 宽度5
char(*px2) [3]; //1维数组指针 宽度3
int(*px3) [2][2]; //2维数组指针
char(*px4) [3][3][3]; //3维数组指针
//本质上 就是指针 3维数组指针可以指向一维数组 反之也可
//进行加减操作时 与普通类型的指针相似 去掉一个星看宽度
px为指针名称
函数指针:
//定义函数指针变量
int (__stdcall *pFun) (int, int, int, int, int);
//函数指针变量赋值
pFun = (int (__stdcall *) (int, int, int, int, int))0x76F6106;
函数指针不能做运算 因为砍掉一个*以后就是一个函数 长度不确定