zoukankan      html  css  js  c++  java
  • (todo)数组名 有存储空间吗?

     

    转与csdn

    对于数组b[]b是数组的地址,但b不算变量,有没有一个地方存放b?而且b是不 
    是存放的就是自己所在的地址。 
    ------------------------------------------------------------- 
    数组名不是对象,数组才是对象,指针也是一种对象,因此,数组名并没有内存空间,它是一个右值。想看具体的代码么?把下面的代码汇编一下,就可以看见其区别了: 

    char   a[10]; 
    char   *p; 
    p=a; 
    a[2]=10; 
    p[2]=20; 

    编译器编译后的汇编代码是这样的: 

    _main proc near 
    push bp 
    mov bp,sp 
    sub sp,10 
    push si 
    lea si,word   ptr   [bp-10]     ;这个就是p=ap被保存在某个地方,这里p被优化为保存在寄存器 

    mov byte   ptr   [bp-8],10       ;这个是a[2]=10a是直接堆栈操作,因为它是一个地址,没有存储空间 

    mov byte   ptr   [si+2],20       ;这个是p[2]=20p是个变量,它被保存在寄存器si里面,因此进行操作时,要先取si的值,然后+2,再进行间接寻址 

    xor ax,ax 
    jmp short   @1 

    如果数组名是一个变量的话,那就必定得先把bp-10保存在某个地方,例如di,就会产生下面的指令:lea   di,   word   ptr[bp-10],事实是,编译器并没有这样做,而是直接堆栈操作。 


    char   *a[2]; 
    那么a的值和&a的值是不是应该一样? 
    ----------------------------------- 
    关于对数组名取地址的问题,由于数组名是右值,本来&a是不合法的,早期不少编译器就是指定&a是非法的,但后来C89/C99认为数组符合对象的语义,对一个对象取地址是合理的,因此,从维护对象的完整性出发,也允许&a,只不过,&a的意义,并非对一个数组名取地址,而是对一个数组对象取地址,也正因为如此,a才跟&a所代表的地址值一样,同时sizeof(a)应该跟sizeof(&a)一样,因为sizeof(&a)代表取一个数组对象的长度。

  • 相关阅读:
    动态数据源切换
    Disconf实践指南:改造篇
    Disconf实践指南:使用篇
    Disconf实践指南:安装篇
    执行Git命令时出现各种 SSL certificate problem 的解决办法
    linux rz 乱码
    分布式配置项管理-开源方案预研究
    mac下mysql5.7.18修改root密码
    git 版本回滚
    关于@Autowired使用注意点
  • 原文地址:https://www.cnblogs.com/titer1/p/2368288.html
Copyright © 2011-2022 走看看