数组的地址是什么?是指向该数组类型的指针。

先看一段代码:


int main()
{
	int a[5]={1,2,3,4,5};
	int *ptr=(int *)(&a+1);
	printf("%d,%d",*(a+1),*(ptr-1));
}


分析:

这里,a是一个数组,包括5个int类型的数据。a本身就代表这个数组的首地址,它等效于&a[0]。

那么,&a是什么呢?

首先,这是取数组a的地址。既然是取地址,那取出来的当然是一个指针。

指向什么呢?指向的当然是所取变量的类型。所以,&a是一个指向包括5个int数据的数组的指针。

然后再看&a+1。既然&a是一个指针,那么对指针进行算术运算时要考虑指针所指类型的大小。从地址值上看,&a+1应该等于a的地址再加上sizeof(a),也就是说,&a+1实际上指向的是a[5]这个数组的最后一个int类型元素的下一个元素,也就是指到a的外面去了。

所以,ptr实际指向的是a[5],即a数组的第6个元素。ptr = a + 5 = &a[5]。


最后再看ptr-1。ptr是int型指针,ptr-1则是ptr的地址往前偏移一个int的位置。所以,ptr-1 = &a[4]。

最后输出的结果为: 2,5




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值