繁体   English   中英

可以用unsigned int替换C中的Pointers

[英]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;

所有三个指针( cpipdap )都以相同的值开始: 0x4000 但是,将1加到每个指针将得到不同的结果。 假设使用32位intfloat类型,我们将得到:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM