C语言笔记 | 变量(Variable)
变量的类型[*]自动变量: auto
[*]默认的局部变量都是auto
[*]静态变量: static
a
[*]默认的全局变量都是static
[*]寄存器变量: register
变量的申请
[*]当申明一个变量时, 编译器会将指定的一块内存空间与变量名进行绑定
[*]变量名只是内存空间的别名(给编译器看的)
变量的操作
[*]取出地址内的值
[*]修改值
[*]将值写入地址
int a = 10;a += 4;
push ebp ;保存ebpmov ebp,espsub esp,4 ;分配一个4字节栈空间(局部变量)(int类型)mov dword ptr ss:,0xA ;给变量赋值十进制数10mov eax,dword ptr ss: ;取出变量的值add eax,4mov dword ptr ss:,eax ;写入变量的值add esp,4 ;还原栈pop ebp ;恢复ebp
指针变量
指针变量存储的是内存地址
int a = 5;int* p = &a;*p += 10;
mov dword ptr ss:,5 ;ebp-8是变量a的地址, 赋值5lea eax,dword ptr ss: ;取出变量a的地址("ebp-8")mov dword ptr ss:,eax ;ebp-c是变量p的地址, 把"ebp-8"作为值写入mov eax,dword ptr ss:mov ecx,dword ptr ds: ;使用eax(变量p)作为地址, 取出值add ecx,A ;加10mov dword ptr ds:,ecx ;使用eax(变量p)作为地址, 写入值
其它
[*]将esp赋值给ebp, 使用ebp作为栈基并以来访问函数的参数, 以来访问函数的变量
[*]栈空间是有限的, 如果只分配不还原(比如无限递归), 最终将溢出
[*]由于函数的调用, 栈指针(esp)是不断变化的(每个函数都要使用栈空间(sub)), 所以为了方便调试使用了ebp
还是要认真沉下心来好好学习的,指针变量真的是重点 Leonws 发表于 2023-9-29 13:47
还是要认真沉下心来好好学习的,指针变量真的是重点
指针太重要了,能对地址进行修改的东西嘎嘎牛逼
页:
[1]