本文共 853 字,大约阅读时间需要 2 分钟。
上次网友问到一个问题,就是简单的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咯! 所以,类型匹配是很重要的呗!!!!!!!!!!
转载地址:http://ooaci.baihongyu.com/