Sunday, 26 February 2017

C 语言学习点滴 2 —— 指针的理解

    前一阵子学习了指针(pointer)的概念,略微感觉有些复杂。我仔细思考了一下,感觉并不是逻辑复杂,而是概念复杂。
    指针在C语言中用于储存变量的地址。或者,从根本上看,指针(pointer)是一个值为内存地址的变量。我们可以类比来看,int类型变量的值是整数,char类型变量的值是字符,那么指针变量的值就是地址。
    接下来,我们要弄清楚几个概念。
  1. 假设一个指针变量名是ptr,我们可以编写以下语句: Source file
     1 ptr = &pooh;
    
    对于这条语句,我们可以说,ptr“指向”pooh,那么现在ptr的值就是pooh的地址。
  2. 紧接着,我们可以使用间接运算符 *(indirection operator)找出储存在pooh上的值(也可以说是找出ptr所指向的值)。 Source file
     1 val = *ptr;
    
    说了这么多,其实我们可以这样来理解指针的概念:
    将计算机的整个内存想象成你所在的宿舍楼,宿舍楼里都是挨个的小房间(相当于一个个宿舍)。

    计算机的内存就是由一组组的储存单元在一起构成的,为了定位每一个单元格,我们会使用十六进制给予每个储存单元一个唯一的身份识别码,称之为地址。比如第一个宿舍我们称之为0x00,第二个宿舍称之为0x01,以此类推。内存的寻址是线性的,对于32位寻址的内存,其最大地址刚好是0xFFFFFFFF,从0到0xFFFFFFFF恰好是4GBytes个单元。诸如此般,我们即可以通过地址来定位一个宿舍了啦!

    但是呢,通过数字来记忆宿舍的位置实在是太麻烦了,很容易就记混,我们可以选择给一个特定的宿舍起一个别名。
    比如,我们给内存位置是0x02的宿舍起名字叫做DOC。这样,DOC就代替了0x02这个地址,帮我们找到这个宿舍。
    这就是指针。我们可以这么说,DOC指向了0x02。
    宿舍里都会住人,在DOC中住了一个我,小汪。我刚刚去上大学,班主任还要很多同学都不认识我,但他们知道我住在DOC房间里,所以呢,都叫我“住在DOC里的那个人”。
    在C语言中的表示就是, *DOC。
    结果我因为敢于发言,当了班长,所以大家都叫我monitor了。
    这个在C语言中就是 monitor = *DOC
    不知道大家看懂了没有,monitor就是变量名,而我,小汪,就是变量啦。

No comments:

Post a Comment