今天在公司和同事讨论一个结构体,结构体中有一个指针,我们对于指针的长度有了意见。
这是一个CC2530的芯片,它的内核是8051,所以我猜测它的指针长度应该是16位的,而同事猜测是32位的。仅仅争执也没有编程试一下。
在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样。但是函数指针长度可能与数据指针的长度不同。指针的长度取决于使用的机器类型和编译器。
我们这里只讨论普通数据指针。大部分现代平台下C语言指针的长度都是32位,目前64位机器搭配64位操作系统的指针长度为64位。
在嵌入式平台上,情况也比较复杂。有8位、16位、32位。据我所知,大部分16位、32位机器的指针长度是32位,因为很多16位机器的地址总线是32位,自然的指针也可以到32位。
比较特殊的是8位平台如8051,它的地址总线是16位。指针如果是32位,高16位完全没有意义,编译器如果对指针的空间分配是按32位来的,那么首先是空间浪费,然后是高16位无意义。因此我坚定的认为像8051这样的平台,指针的长度应该是16位的。
说到底还是没有测试,指针长度取决于具体的C编译器实现。大家使用的时候如果有疑问应该参考编译器手册。
【后记】
最后没忍住,还是试了一下,在IAR 中, 指针长度是16位的。也验证了我的猜测。