关于变量标识和数组标识的地址问题

变量是指一块内存,这句话怎么理解?

 

 

void main()
{
  int a= 2;
  int *p = &a;
}

//编译得到
main:
 pushl %ebp
 movl  %esp,%ebp
 subl    $16,%esp
 movl   $2, -8(%ebp)    // int a = 2;
 leal      -8(%ebp), %eax  // int *p = &a;
 movl   %eax,-4(%ebp)
 leave 
 ret

 at&t汇编,源数据在前目标在后。

 

①在编译后这个‘a’已经不存在,它就是一块内存的地址,所有对‘a’的操作,编译器自动转化为对该地址内数据的操作。如上int a = 2 就是把 2 赋值给 ebp寄存器所存地址-8 这块内存上

②leal就是把ebp寄存器所存地址-8 这个值 赋值给eax寄存器,而不是该寄存器保存的内存地址上保存的值

③指针变量p和a一样,编译后都是一块地址,‘int’、‘*’都是给这个地址做限定

 

 

例2

 

void main()
{
  int temp[] = {1,2};
  int *p = temp;
  int (*m)[] = &temp;
}

编译后获得:
main:
  pushl  %ebp
  movl   %esp,%ebp
  subl     $16,%esp
  movl    $1,-16(%ebp)
  movl    $2,-12(%ebp)  //int temp[] = {1,2};
  leal    -16(%ebp) ,%eax
  movl     %eax,-8(%ebp) // int *p = temp;
  leal    -16(%ebp),%eax
  movl    %eax,-4(%ebp)  // int (*m)[] = &temp;
  leave
  ret

 ①所有对数组变量的操作都是对,数组第一个元素所在地址的操作

 ②对&temp的操作也是对该地址的操作;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值