面試題一則

前些時去面試在卷子上做到了這么一題(C),很有意思,拿出來共賞之。

int  a[ 5 =   {12345} ;
int   * p,  * q;
=  a;
=   & a[ 3 ];
//問a[q - p]多少?

當時我想答3,可一看選項:0、1、2、4,。。。索性就填了4,後來回來一編譯,就是4,汗。。。

下面我們來仔細研究研究。

p是指向數組a的整型指針,它是“瞄準”數組a的第0個元素的地址,即用下標表示:&a[0],用指針偏移表示:a + 0

為什么真么強調p是整形指針呢?因為數組名稱正好也就是數組的第一個元素的地址,換句話說想聲明一個指向數組第一個元素的指針同聲明一個指向數組的指針(數組指針)頗有些相似之處。比如說這里要聲明一個指向數組a的數組指針,就得這樣:

int  ( * ptr)[ sizeof (a)]  =   & a;//ptr是指向數組a的數組指針

上面題中的q聲明的僅僅是個整型指針,所以不用受這些東西的迷惑。q是誰?q是&a[3],下標運算符[]的優先級高于取地址運算符&,所以就是對a[3]取地址,取來的就是數組a的第3個元素的地址,即用下標表示:&a[3],用指針偏移表示:a + 3,這就是q。

所以a[q - p] = a[(a + 0) - (a + 3)] = a[3] = 4

確鑿無疑。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值