一个简单的 C 语言指针问题

 

上次网友问到一个问题,就是简单的C的指针的问题:

    

    一个数组:int a[3] = { 1, 2, 3 };

    他说为什么:printf( "%d", a );

    printf( "%d",&a );

    的值是一样的,其实这是很简单的C指针问题,但是也是初学者易错的地方!

 

    首先我们必须明白数组的实质意义:其实最终产生指令代码之前还是需要化成指针来计算的,a[3]其实就是

    以a为首地址的后面连续3个int物理空间而已,大家都知道调用 printf( "%d",a );是输出首地址,但是你想想看,a[0]的地址也就是数组a的首地址吧,那么我们现在调用a[0]的地址不就是&(a[0]),其实本质就是:  &(*( a + 0 );那么再次转化一下呗~不就是:&( *(a );转化回来不就是:&a;呵呵呵~~~~~ 

 

   还有一题:

   仍然使用上面的数组:

   执行:printf( "%d",*((int*)(&a+1)-1) );

    输出的结果是:3,这是为什么呢??????

  

 

  我的理解:最重要的是理解首先我们计算机的问题啊,都是要针对摸个类型来说、不同的类型之间是没有可比较性的,那么就有人说可以强转,是的,那是所谓的值之间,或者说是通用指针(没有类型,根据你自定义的处理,其实就是忽悠! )之间。那么在今天的上述代码中,开始解释:首先:(int * )( &a +1 );是大家首先也是最重要理解的,很多人认为那只不过是在首地址前面加上4个字节,&a是数组指针,其类型为int(*)[3];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。a是长度为3的int数组指针,所以要加3*sizeof(int);那么也就是:相当于是&a[3];那么后面的-1呢? 要知道(int*)(&a +1)与(&a+1)类型是不一样的(这点很重要,因为是强转过来的~)所以-1只会减去sizeof(int);所以最终的结果就是a[2],那么答案就是3咯! 所以,类型匹配是很重要的呗!!!!!!!!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值