一、指针的内存布局先看下面的例子: int *p; 大家都知道这里定义了一个指针p。但是p 到底是什么东西呢?还记得第一章里说过,“任何一种数据类型我们都可以把它当一个模子”吗?p,毫无疑问,是某个模子咔出来的。
我们也讨论过,任何模子都必须有其特定的大小,这样才能用来“咔咔咔”。那咔出p 的这个模子到底是什么样子呢?它占多大的空间呢?现在用sizeof 测试一下(32 位系统):sizeof(p)的值为4。嗯,这说明咔出p 的这个模子大小为4 个byte。显然,这个模子不是“int”,虽然它大小也为4。既然不是“int”那就一定是“int *”了。好,那现在我们可以这么理解这个定义:
一个“int *”类型的模子在内存上咔出了4 个字节的空间,然后把这个4 个字节大小的空间命名为p,同时限定这4 个字节的空间里面只能存储某个内存地址,即使你存入别的任何数据,都将被当作地址处理,而且这个内存地址开始的连续4 个字节上只能存储某个int类型的数据。
这是一段咬文嚼字的说明,我们还是用图来解析一下: |