C 指针的理解

想想自己曾经学习C语言时,初次见到指针、地址,只能死记硬背,经过一段时间的软磨硬泡,终于有所收获,在此记录自己对C语言中地址、指针的理解。 
  推荐对C语言有一定理解的程序员阅读。 
  学习过C语言的程序员们,一定都知道“指针就是地址”的经典描述,到底如何理解指针就是地址。

1. 内存长成啥样? 
  物理内存条由连续排列芯片组构成,在计算机中内存模型也被抽象为一组连续的存储空间,每个空间都能够存储若干字节的数据,每一块存储空间也有一个特定的序号,从0到N。 
备注:为了便于理解,此处,将内存存储空间横向排列(实际横纵排列的意义相同)。


2. 地址是什么? 
变量的地址指的实际就是保存变量数据的内存节点序号。

    int a = 10;     //int 占用4个字节
    printf("&a = %08X\n", &a);  //打印a的地址 008DF70C
  • 1
  • 2

  非常简单的一段代码,打印变量a的地址,008DF70C就是内存地址,也是存放数据的起始位置(内存序号),数值10就保存在008DF70C~008DF70F(共4个字节的内存空间),从下图就能直观的看出变量和地址的关系。 
C 指针的理解_第1张图片 
图中(蓝色)选中部分的数值0000000a,就是a的数值10的十六进制表示。前面7个0是因为存储的数值过小,数据高位被0填充。


3. 指针是什么?为什么说指针就是地址?两者之间的关系是什么? 
  指针也是变量,不过是与普通的数据类型(int, long, float, double等)不同的变量,因为指针的值记录的是相同类型变量的地址(内存序号)。

    int a = 10;     //int 占用4个字节
    printf("&a = %08X\n", &a);   //打印a的地址005DF740

    int *p = &a;    //int*类型的指针p指向int类型变量a的地址
    printf("*p = %08X\n", *p);  //打印指针p指向的值,10
    printf("p = %08X\n", p);    //打印指针p指向的地址,005DF740
    printf("&p = %08X\n", &p);  //打印p的地址,005DF734
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  代码中定义int类型指针p,初始化指向变量a的地址,并打印p指向地址的值,p的值,以及p的地址。结合下图,可以看出,p的值与a的地址相同(废话,初始化代码都已经知道了 v_v),通过下图可以看出p和&a是同一个地址空间005DF740,记录的值是10。 
C 指针的理解_第2张图片 
   
  既然说指针也是变量,指针的地址记录的是什么呢?一起接着看下面这张截图。 
C 指针的理解_第3张图片 
  图中,查看p的地址(&p),在005DF734~005DF737的地址(内存序号)中保留的数值经过高低位转换(40 F7 5D 00 -> 005DF740),正是变量a的地址。由此可见,指针是记录内存地址的“特殊”变量。 
  指针就是地址,其实是指平时使用指针过程中,指针变量记录的就是地址,如例子中的int指针p,直接打印的结果就是指向a的地址,如果想获得指向地址的值,需要使用*。 
  指针指向一块保存变量的地址。

仔细看图的读者会发现,指针存储空间也是4个字节。可以用sizeof()打印指针的长度确认一下,等长的存储空间是任意转换指针类型的基础。

  每个人对C指针的理解都有差别,我希望我的理解能对初学新手带来一点点帮助。文中有很多漏洞和不足,望大家提出。


你可能感兴趣的:(C 指针的理解)