指针和数组

转载http://kan.weibo.com/con/3512394345711963


C程序:考考你(04)

一、取材于某著名公司的软件人员面试题,请问下面程序的输出结果是什么:
#include <stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a+1);
printf("%d, %d", *(a+1), *(ptr-1));
return 0;
}
答案:2, 5

二、理由解释:
(1) a是数组首地址,也就是a[0]的地址,(a+1)是数组下一元素的地址,即a[1]的地址,因此*(a+1)就是a[1]的值。
(2) &a是对象首地址,该对象是5个int长度的类型,(&a+1)是对象地址加一,即对象首地址加了5个int的长度,因此(&a+1)是a[5]的地址。

注:换个写法是否能有助理解。
#include <stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
int (*ptr)[5] = &a;
ptr++;
printf("%d, %d", *(a+1), *((int *)ptr-1));
return 0;
}

三、我的提示:
不同类型的指针加一之后其地址增加的值是不同的,char型指针加一地址增加1,int型指针加一地址增加4,int (*)[5]型指针加一地址增加5个int长度,即20。由此可知对指针进行代数运算是有风险的,因此即将颁布的国军标《军用软件C/C++语言安全子集》中有建议准则“5.3.2.3 谨慎对指针进行代数运算”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值