指针迷惑

#include<stdio.h>
 void main()
 {
	 int a[]={1,2,3,4,5};
	 int *ptr1 = (int*)(&a+1);
	 int (*ptr2)[5] = (&a+1);
	 printf("%d %d\n",*(a+1),*(ptr1-1));
	 printf("%d %d",a,*(ptr2-1));

 }

数组名本身就是指针,加个&,就变成了双指针,这里的双指针可看作是二维数组,加1,就是数组的整体加一行,所以ptr1指向第六个元素。

(此处ptr1需要是指向整型的指针类型才能表示指向的是数组a五个元素的下一个元素,因为&a是数组首元素的地址的地址,所以在(&a+1)前面需要进行类型转换将 int*[5]类型转换为int *,通过类型转换将原来指向数组的指针改为指向整型元素的指针,所以才会说指向第六个元素(并不存在))


int (*ptr2)[5] = (&a+1);
是&a+1不进行类型转换的情况,此时ptr2-1 指向的不是数组a的第五个元素,而是数组a的首元素的地址,即a;所以第二条输出语句输出的两个结果相同。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值