[英]Can unsigned int replace Pointers in C
由于“ unsigned int”的范围等于“ int *”或任何指针的范围,因为两者在64位平台上都占用4Bytes。 可以将C中的指针替换为unsigned int吗?
没有对unsigned int
保证。 C99中引入了特殊类型uintptr_t
来保存指针,而不管平台是什么。 您需要包括<stdint.h>
标头才能使用此类型。
绝对不。 在64位平台上,指针可能是八个字节,而不是四个字节! 有时您可以避免在long long
和64位指针之间进行强制转换,但这仍然值得怀疑。
您甚至无法确保int
在64Bit arch中为4字节! 因为类型限制是绝对实现和环境定义的。 该标准仅给出了必须至少具有哪个范围的限制。 就这样。 int
甚至可以是64位上的8字节,也可以是10字节,也可以是13字节,也可以是环境想要其大小的大小。 因此,您当然可以替换它。 但这可能导致无效对齐或导致数据丢失。 由于每种类型的分配都可以具有不同的大小。 但是至少您可以将一个指针值分配给一个int
值。 但这也是ISO / IEC9899有效的从值类型到指针类型的唯一转换。
简短的回答:不。
稍长一点的答案:无法保证unsigned int
能够为给定平台保留有效的指针值(一些人已经指出64位平台的地址值可能不在unsigned int
范围之外) 。 指向不同类型的指针可能具有不同的大小和表示形式,这使情况更加复杂。
指针不仅仅对地址值进行编码; 他们还编码一个类型 。 这对于指针算术和数组下标很重要。 例如,假设声明:
char *cp = 0x4000;
int *ip = 0x4000;
float (*dap)[10] = 0x4000;
所有三个指针( cp
, ip
, dap
)都以相同的值开始: 0x4000
。 但是,将1加到每个指针将得到不同的结果。 假设使用32位int
和float
类型,我们将得到:
cp + 1 == 0x4001
ip + 1 == 0x4004;
dap + 1 == 0x4028;
将1加到cp
得到下一个char
对象(0x4001)的地址,将1加到ip
得到下一个int
对象(0x4004)的地址,将1加到dap
得到下一个10个元素的数组的地址。 float
对象(0x4028)。 这使我们可以在每个指针上使用[]
运算符:我们可以编写cp[i]
和ip[i]
并获得我们期望的结果(指针之后的第i
个元素)。 但是,如果将所有这些指针键入为unsigned int
,则将无法使用下标运算符,将它们加1只会给您下一个字节地址,而不一定是下一个对象的地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.