指针的内存布局
先看下面的例子
int *p;
大家都知道这是定义了一个指针p,但是p到底是什么东西呢?还记得第1章里说过“任何数据类型我们都可以把它当成一个模子”吗?p,毫无疑问,是某个模子“咔”出来的。我们也讨论过,任何模子都必须有特定的大小,这样才能“咔咔咔”。那“咔”出p这个模子到底是什么样子呢?它占多大的空间呢?现在用sizeof测试一下(32位系统):sizeof(p)的值为4。嗯,这说明“咔”出来的这个模子的大小为4字节。显然,这个模子不是“int”,虽然它的大小也为4。既然不是“int”,那肯定就是“int *”了。好,那现在我们就可以可以这么理解这个定义:
一个“int *”类型的模子在内存上“咔”出了4字节空间,然后把这个4字节大小的空间命名为p,同时限定这个4字节空间里面只能存储某个内存地址,即使你存储别的任何数据,都经被当做地址处理,而且这个内存地址开始的连续4字节上只能存储某个int类型的数据。
如上图所示,我们把p称为指针变量,p里面存储的内存地址处的内存称为p所指向的内存。指针变量p里存储的任何数据都将被当做地址来处理。
我们可以简单地这么理解:一个基本数据类型加上“*”就构成了一个指针类型的模子。这个模子的大小是固定的,与“*”号前面的数据类型无关;“*”号前面的数据类型只是说明指针所指向的内存里存储的数据类型。所以,在32位系统下,不管什么样的指针类型,其大小都为4字节。可以测试 sizeof(void *) 来进行验证。