shinanciya 发表于 2023-9-28 21:01

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

还是要认真沉下心来好好学习的,指针变量真的是重点

mmdg13142 发表于 2023-9-29 20:00

Leonws 发表于 2023-9-29 13:47
还是要认真沉下心来好好学习的,指针变量真的是重点

指针太重要了,能对地址进行修改的东西嘎嘎牛逼
页: [1]
查看完整版本: C语言笔记 | 变量(Variable)