博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个简单的 C 语言指针问题
阅读量:4054 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++模板与泛型编程
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
Returning a value from a function
查看>>
course_2_assessment_6
查看>>