取消引用64位平台上的整数指针

时间:2017-08-04 19:42:21

标签: c pointers dereference

如果我们取消引用整数指针,比如*(int *)
我们知道整数指针在64平台中占主导地位8字节。但整数在64平台上仍需要4个字节。

如果我想取消引用其内存开头包含另一个指针地址的指针,该怎么办?所以实际上我想取前8个字节的值。将取消引用*(int *)得到4字节或8字节?我认为它应该是4字节,因为整数是4字节。但是如何才能在64位平台上获得8字节?不知道平台是32位还是64位。

2 个答案:

答案 0 :(得分:4)

让我们明确一些事情(这些都是平台独立的,但在大多数情况下),如果在你的系统上:

sizeof(int) is 4 bytes
sizeof(int*) is 4 on 32bit and 8 on 64bit
sizeof(int**) is 4 on 32bit and 8 on 64bit

当您取消引用int*时,您正在提取int。原始int*在64位上可能是8个字节,但您将从32位或64位系统获得4个字节。

当您取消引用int**时,您正在提取int*。原始int**可以是32位上的4个字节或64位上的8个字节,但是您将从32位系统获得4个字节,从64位系统获得8个字节,因为您正在提取int*

答案 1 :(得分:0)

我不确定我是否理解你的问题,但实际上我认为你根本没有问题,因为编译器会自动处理字大小,生成正确的代码对于每个平台。因此,让我们假设您调用一个函数,该函数返回指向int的指针:

int** ppiValue = SomeFunction ();

如果取消引用此指针,则会得到一个指向int的指针,该指针在每个平台上都具有适当的大小:

int* piValue = *ppiValue;

这将是64位处理器上的8个字节,或32位处理器上的4个字节。编译器负责为所选目标平台选择正确的大小。现在让我们取消引用这个指针:

int iValue = *piValue;

这将是两个处理器上的4字节值。再一次,编译器负责生成正确的机器代码指令。

所以不要打扰 - 只要您依赖强类型并且不使用危险的类型转换,编译器就会处理低级别的间接细节。