C 语言中不同类型指针的大小是完全相同的。因为指针本身存放的是内存地址,而内存地址的长度是固定的(32位或64位),所以要存放固定长度的地址,小了不够、多了浪费。
一、C 语言中不同类型指针的大小是否完全相同
C 语言中不同类型指针的大小是完全相同的。因为指针本身存放的是内存地址,而内存地址的长度是固定的(32位或64位),所以要存放固定长度的地址,小了不够、多了浪费。
主流平台如:x86、x64、IA64、arm等平台,基本不再需要考虑指针本身的大小差异了。另外现代的标准还规定编译器应该定义如下类型:std::intptr_t 和void*同大小的有符号整数std::uintptr_t 和void*同大小的无符号整数这两个类型通常用于将指针类型转换成整数类型用于运算、存储或传递的场合。另外,C++标准规定了用于表示数据大小的类型:std::size_t,以及表示指针差值的类型std::ptrdiff_t 这两个类型通常用于需要将指针/大小进行数值运算的场合。在目前的主流平台与编译器中,它们恰好与void*同大小,但为了更好的可移植性,如果要将一个指针强制转换成整数类型,应该用std::uintptr_t或std::intptr_t
但对于位数低的老 CPU 和嵌入式 CPU 那就不一定了,像 8086 就因为其分段的内存模型,引入了三种不同的指针:Near,大小为 16 位;Far,大小为 32 位(段 + 偏移),不进行规范化,指向的数据结构不能跨段;Huge,大小为 32 位(段 + 偏移),有规范化:这种指针的算术运算需要特殊实现来支持跨段的大型数据结构。对于这些平台,往往一组 malloc/free 是不够的,它们的 C 库都会提供多组不同的分配/回收函数来从内存的不同区域分配内存。如果涉及 EMS/XMS 之类需要驱动才能使用的扩展内存的话,它们分配给你搞不好就不是常规的指针了,而是一个特殊的 Handle,你需要调取驱动里面的功能来访问它们对应的内存。
延伸阅读:
二、C语言的主要特点
1.语言简洁、紧凑,使用方便、灵活 。C语言一共只有32个关键字、9种控制语句,程序书写形式自由,主要用小写字母表示,压缩了一切不必要的成分。C语言比其他许多高级语言简练,源程序短,因此输入程序时工作量少。
2.运算符丰富,C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值和强制类型转换等都作为运算符处理,从而使C语言的运算类型极其丰富,表达式类型多样化。
3.数据类型丰富。C语言提供的数据类型包括整形、浮点型、字符型、数组类型、指针类型、结构体类型和共用体类型等,C99又扩充了复数浮点型、超长整型(long long)和布尔类型(bool)等。尤其是指针类型数据,使用十分灵活和多样化,能用来实现各种复杂的数据结构(如链表、树、栈等)的运算。
4.具有结构化的控制语句。用函数作为程序的模块单位,便于实现程序的模块化。C语言是完全模块化和结构化的语言。
5.语法限制不太严格,程序设计自由度大。