浅谈指针(七)——定义与声明

对象必须有且只有一个定义,但是它可以有多个extern声明。定义是一种特殊的声明,它创建了一个对象;声明简单地说明了在其他地方创建的对象的名字,它允许你使用这个名字。

定义只能出现在一个地方,确定对象的类型并分配内存,用于创建新的对象。

声明可以多次出现,描述对象的类型,用于其他地方定义的对象。

声明相当于描述其他地方的创建的对象,定义相当于为对象分配内存。

extern对象声明告诉编译器对象的类型和名字,对象的内存分配则在别处进行。由于并未在声明中为数组分配内存,所以并不需要提供关于数组长度的信息。对于多维数组,需要提供除最左边一维之外其他维的长度。

编译器为每个变量分配一个地址,即左值,这个地址在编译时可知,而且该变量在运行时一直保存于这个地址,相反,存储于变量中的值只有在运行时才可知,如果需要用的变量中的存储的值,编译器就发出指令从指定地址读入变量值并将它存于寄存器中。

如果编译器需要一个地址来执行某种操作,他就可以直接进行操作,并不需要增加指令首先取得具体的地址。相反,对于指针,必须在运行时取得它的当前值,然后才能对它进行解除引用操作。

对于数组,extern char a[]与extern char a[100]等价,编译器并不需要知道数组总共多长,因为它值产生偏离起始地址的偏移地址。

相反,如果声明extern char *p,它将告诉编译器p是一个指针,它所指向的对象是xxxx,为了取得内容,必须得到地址p的内容,把它作为字符的地址并从这个地址取得这个字符。指针的访问要灵活的多,但需要增加一次额外的提取。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值