C语言笔记 | 变量(Variable)
发表于:2022-06-08 | 分类: C语言笔记

变量的类型

  1. 自动变量: auto
    • 默认的局部变量都是auto
  2. 静态变量: static
    • 默认的全局变量都是static
  3. 寄存器变量: register

变量的申请

  • 当申明一个变量时, 编译器会将指定的一块内存空间与变量名进行绑定
  • 变量名只是内存空间的别名(给编译器看的)

变量的操作

  1. 取出地址内的值
  2. 修改值
  3. 将值写入地址
    1
    2
    int a = 10;
    a += 4;
1
2
3
4
5
6
7
8
9
10
11
push ebp ;保存ebp
mov ebp,esp
sub esp,4 ;分配一个4字节栈空间(局部变量)(int类型)

mov dword ptr ss:[ebp-4],0xA ;给变量赋值十进制数10
mov eax,dword ptr ss:[ebp-4] ;取出变量的值
add eax,4
mov dword ptr ss:[ebp-4],eax ;写入变量的值

add esp,4 ;还原栈
pop ebp ;恢复ebp

指针变量

指针变量存储的是内存地址

1
2
3
int a = 5;
int* p = &a;
*p += 10;
1
2
3
4
5
6
7
mov dword ptr ss:[ebp-8],5 ;ebp-8是变量a的地址, 赋值5
lea eax,dword ptr ss:[ebp-8] ;取出变量a的地址("ebp-8")
mov dword ptr ss:[ebp-C],eax ;ebp-c是变量p的地址, 把"ebp-8"作为值写入
mov eax,dword ptr ss:[ebp-C]
mov ecx,dword ptr ds:[eax] ;使用eax(变量p)作为地址, 取出值
add ecx,A ;加10
mov dword ptr ds:[eax],ecx ;使用eax(变量p)作为地址, 写入值

其它

  • 将esp赋值给ebp, 使用ebp作为栈基并以[ebp+??]来访问函数的参数, 以[ebp-??]来访问函数的变量
  • 栈空间是有限的, 如果只分配不还原(比如无限递归), 最终将溢出
  • 由于函数的调用, 栈指针(esp)是不断变化的(每个函数都要使用栈空间(sub)), 所以为了方便调试使用了ebp
上一篇:
C语言笔记 | 初始化器
下一篇:
C语言笔记 | 宏定义