分享

(todo)数组名 有存储空间吗?

 lchjczw 2012-11-23
对于数组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)代表取一个数组对象的长度。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多