令主管都蒙蔽的超级指针使用!你懂嘛?

#include<stdio.h>

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

}

[解析]:

 注:左边为下标,右边为值!

  

printf("%d,%d\n",*(a+1),*(p-1));


//这里的*(a+1) 就是a[1],也就是说下标为1的值对应2!


//而这里的*(p-1)那就有点绕啦


int *p =(int *)(&a+1);

//解析:p等于a取地址加一,然后再强制转换成int(也就是整型)

//而这里的a取地址的具体含义是什么呢?大家可以先不看下面UP的解析自己在脑海中想想


解析:一维数组名取地址;它相当于一个二维数组名 转换成代码就是 int(*p)[5]; p =&a;
    而 p =&a;就是p+1,然后移动5个元素


例:如果p=&a等于下标为0对应的值的话,a取地址+1 想当于移动了5个元素,所以这时p=&a对应的是下标为4的下一个下标,也可以把它理解成下标为5对应的值.但是但是但是,重要的事说三遍,看到那个强制转换(int *)没各位,这是它相当于一个一级指针,然后又赋给了 int *p,所以它的指针位置不动,但是它又变成了一级指针,一次移动一个整数; *(p-1) 相当于下标望上移动一个位置,这是所指的下标为4,也就是下标为4,值为5,再*取值,解引用,5就变出来啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值