0

因为“unsigned int”的范围等于“int *”的范围或任何指针,因为在 64 位平台上两者都占用 4Bytes。可以用 unsigned int 替换 C 中的指针吗?

4

4 回答 4

6

没有这样的保证unsigned intuintptr_tC99 中引入了一种特殊类型来保存指针,而与平台无关。您需要包含<stdint.h>标题才能使用此类型。

于 2013-11-04T14:03:00.957 回答
1

绝对不。在 64 位平台上,指针可能是8个字节,而不是 4 个!有时您可以在long long64 位指针和 64 位指针之间进行强制转换,但即使这样也是有问题的。

于 2013-11-04T14:02:53.077 回答
0

简短的回答:没有。

稍微长一点的答案:对于给定的平台,不能保证unsigned int能够保存有效的指针值(一些人已经指出,64 位平台的地址值可能会超出 的范围unsigned int)。由于指向不同类型的指针可能具有不同的大小和表示形式,这使情况变得更加复杂。

指针不只是对地址值进行编码;他们还对type进行编码。这对于指针算术和数组下标很重要。例如,假设声明:

char *cp = 0x4000;
int  *ip = 0x4000;
float (*dap)[10] = 0x4000;

所有三个指针 ( cp, ip, dap) 都以相同的值开始:0x4000. 但是,给每个指针加 1 会产生不同的结果。假设 32 位intfloat类型,我们会得到:

cp + 1  == 0x4001
ip + 1  == 0x4004;
dap + 1 == 0x4028;

加1cp给我们下一个char对象的地址 (0x4001),加 1ip给我们下一个int对象的地址 (0x4004),加 1dap给我们下一个 10 元素数组的地址float(0x4028) . 这允许我们[]在每个指针上使用运算符:我们可以编写cp[i]ip[i]得到我们期望的结果(i指针后面的第 ' 个元素)。但是,如果您将所有这些指针键入为unsigned int,您将无法使用下标运算符,并且向它们添加 1 只会给您下一个字节地址,而不一定是下一个对象的地址。

于 2013-11-04T14:38:53.397 回答
0

您甚至无法确定int64 位拱门中的 4 字节!因为类型限制是绝对实现和环境定义的。该标准仅给出了哪个值必须至少具有哪个范围的限制。就这样。int甚至可以是 64 位上的 8 个字节,可以是 10 个字节,也可以是 13 个字节,或者可以是环境希望其大小具有的任何大小。所以当然可以更换。但它可能以无效对齐结束或导致数据丢失。由于每个分配类型可以有不同的大小。但至少您可以将指针值分配给一个int值。但这也是 ISO/IEC9899 有效的从值类型到指针类型的唯一转换。

于 2013-11-04T14:07:41.933 回答