从指针转换为整数。实际发生了什么?

时间:2015-08-30 12:25:09

标签: c pointers 64-bit

从指针转换为整数。究竟发生了什么?以下是我认为可能发生的一些方式:

  • C代码自动获取指针指向的地址中的值,并将其插入到整数中。
  • 整数取指针中的地址并将地址存储在4个字节中。

我要问的原因是因为从32位更改为64位指针不能再强制转换为整数。这是因为指针占用的内存大小为64位,即8个字节。

指针可能指向一个整数或一个整数,因为我们不知道指针指向的值大小。

是指针地址不能存储在整数中还是它包含的值不能存储在整数中?

说这个简单的代码。这不适用于64位。即使将指针视为整数,也无法强制转换。这让我相信它不是取值而是取指针的地址并将其插入整数。

  

在32位中,整数取指针地址并知道它有   从该指针地址取4个字节以获得完整值。

该陈述是否正确?

int main(void){

int number = 3;
int * pnumber = &number;
int castNumber = (int)pnumber;

}

我看了一下这个问题,但仍然没有理解真正发生在幕后的事情。 http://c-faq.com/ptrs/int2ptr.html

2 个答案:

答案 0 :(得分:-1)

Casting实际上是对conpiler说的,看看这里的价值并将其视为另一种类型''。在指针的情况下,由指针保存的地址现在变为整数。是的,在64位模式下,您不能将sn地址存储为整数,而是存储为long int

示例:

int k=3;
int *pInt = &k;
long int castPtr = (long int)pInt;
int *another_pInt = (int*)castPtr; // *another_pInt is now 3

修改

首选unsigned long超过long int。你可能不应该关心价值的标志,因为它是一个地址。

答案 1 :(得分:-2)

  

这让我相信它没有取值而是取指针的地址并将其插入整数。

当然,它没有取指针指向的值。

要获取指针指向的值,您需要执行*pnumber(取消引用)。仅使用pnumber,您将获得指针指向的地址。

当您将指针地址存储在整数数据类型中时,结果将取决于案例。

1)如果整数数据类型和地址长度不同,那么当将其存储在整数数据类型的变量中时,地址的额外字节将会丢失。

2)如果大小相同,您可以将地址存储为整数数据类型。但是,我不能想到你需要的情况。

另一点是,如果整数数据类型的大小和地址相同,您可以安全地转换为int并返回address。阅读本文See this