浅谈 指针-你真的了解指针吗?

来源:互联网 发布:淘宝食品类目规则 编辑:程序博客网 时间:2024/05/22 03:54
指针
关键字另类新奇

最近在学习的过程中,产生了疑问,也得到了解决,对于指针的了解又上了一个层面
-----下面,我就对 (平日里以为很了解的指针)来发表一下我的一个另类的观点
   请看下面代码:
#include<stdio.h>int main(){    int *p;    return 0;}
上述代码,我们也许会认为:这是定义了一个《指向整型变量的指针》 。

    -------------  咦?  难道不都是这么理解吗?      真奇怪 ? 如果不这么理解,那么怎么理解这个问题呢?
 开始抛出观点之前,我们先了解一下计算机的内存地址分配原则
    内存寻址由大到小,优先分配内存地址较大的空间给变量(从下往上),先定义的变量,分配的地址越大
  好了,了解了内存分配原则:我们引入正题,请看下面代码。
#include<stdio.h>int main(){    int a = 2;    char c = 1;    int *p = &c;    printf("%d.\n",*p);    return 0;}
   有人会对上述代码有疑问,为什么整型指针,会指向一个字符型数据的地址,编译器不会报错吗?
          -------- 答案是,可能编译器会报警告。但是,并不影响我们分析指针。
  首先,请看上述代码在内存中的表现形式:如下图
     该代码运行结果为513
    (PS:关于变量的数据内存是高字节在前低字节在后 还是字节在前高字节在后 我们逐步讨论)
   我们知道,对于指针,无论类型是int . float .short等(在32位cpu里面都是占4个字节)-- 那么疑问来了,都是占4个字节,为什么还要定义指针的类型
         -----  注意:这是本文谈论的重点。
   由上述代码可以看到,这个指针p指到了char数据类型的地址(这么一来,开头关于指针的理解就不完全正确),                                -------- 那么,该怎么理解这个指针的指向。
   事实上我们不应该说成指向整型变量的指针, 而是(该指针指向了一个变量,至于什么变量我们不去管它,然后对该变量取(指针的类型【?*p】)个字节的数据,当?是 int型指针时即从上往下取4个字节
    那么取了之后会变成什么值呢?    请看下图所示  :
  
---- 取之后的数据为   (箭头从下往上读取)
即二进制形式为0000 0000 0000 0000 0000 0010 0000 0001(该值为513).
    这就是为什么我们要求指针类型要和指向的类型配对,就是避免这种取值溢出的情况(如果指针是char *p,就只从char c的地址处开始取出1个字节(8位)的数据,刚好等于 0000 0001 ,值为c)
       ----现在了解了,不会再单纯的说int *p是指向整型数据的指针了吧(它是可以指向任何变量的地址,只是取值上有差异)。
      分割线------------------------------------------------------------------------------------------------------------------

下面,我们来探讨一下怎么判断你的编译器对变量分配内存时是(高字节在前低字节在后) 还是 (低字节在前高字节在后
变量的而二进制(比如short a = 2 )
在内存中二进制为 0000 0000 0000 0010   高字节在前低字节在后
     还是 0000 0010 0000 0000   字节在前高字节在后
   请看下面代码:
#include<stdio.h>int main(){    short a = 2;    char *p = &a;    printf("%d.\n",*p);    return 0;}该代码在内存中的表现形式为下图:
  
 结合上述所讲指针内容,可得出 如果 *p = 0,则  字节在前高字节在后
如果 *p = 2,则  字节在前低字节在后

         以上内容由本人对指针产生疑问---查阅资料----最后做出的一个另类讲解;希望对大家在学习指针的路上多多少少有所帮助。
----------------------------------------------------谢谢阅读-------------------------------------------------------------------






0 0
原创粉丝点击