Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将int转换为int*然后再转换回int 我在这里漏掉了一些明显的东西,但是考虑下面的, int k = 10; int *p = &k; int i = (int)p; int k = 10; int *p = &k; int i = p;_C_Gcc - Fatal编程技术网

C 将int转换为int*然后再转换回int 我在这里漏掉了一些明显的东西,但是考虑下面的, int k = 10; int *p = &k; int i = (int)p; int k = 10; int *p = &k; int i = p;

C 将int转换为int*然后再转换回int 我在这里漏掉了一些明显的东西,但是考虑下面的, int k = 10; int *p = &k; int i = (int)p; int k = 10; int *p = &k; int i = p;,c,gcc,C,Gcc,上述产品 warning: cast from pointer to integer of different size 随后, int k = 10; int *p = &k; int i = (int)p; int k = 10; int *p = &k; int i = p; 原因, warning: initialization makes integer from pointer without a cast 通过谷歌搜索,我发现 哪些建议使用uintptr\

上述产品

warning: cast from pointer to integer of different size
随后,

int k = 10;
int *p = &k;
int i = (int)p;
int k = 10;
int *p = &k;
int i = p;
原因,

warning: initialization makes integer from pointer without a cast
通过谷歌搜索,我发现

哪些建议使用uintptr\t

int k = 10;
int *p = &k;
int i = (uintptr_t)p;
以上操作没有错误,没有警告。所以我的问题是k是一个int,p是一个指向k的int指针,为什么我会得到一个错误解引用p

int k = 10;
int *p = &k;
int i = *p;
注意最后一行p前面的*号。取消对指针的引用以获取指针指向的int

编辑:我不太熟悉uintptr\u t,但我运行了代码int I=(uintpttr\u t)p;
存储到i中的结果是k的内存地址,而不是10。强制转换告诉编译器您确实想将地址转换为整数(因此没有任何警告;因为您坚持要编译器知道您在做什么),但没有取消引用指针。

您收到一个错误,因为您实际上没有取消引用
p
,您只是强制转换了它(强制更改了它的类型)从
int*
。要取消引用,需要使用
*
运算符,如下所示:

int i = *p;

您没有取消对指针的引用,因此将指针的地址分配给int

int i = *p;

是您最想要的。

您正在玩int到指针的转换,这不能保证两者使用相同的内存量。事实上,它并不能保证在人们使用它时使用相同的大小,但对于大多数平台来说,它只是碰巧工作

由于您在后一个示例中显式地强制转换,编译器假定这不是错误(或者您为什么要键入它?)。这就是编译器输出不同的原因

请注意,如果您不想将k的内存地址存储到i中,那么将k的值存储到i中的正确方法是

int i = *p;

应该是这样的

int k = 10;
int *p = &k;
int i = *p;
我是这样想的

k=10

p=某个地址

&k=某个地址


*p=10

您正在将
i
设置为等于
k
的地址(这就是
p
所包含的内容)。并且地址值是无符号类型。因此,当从指针强制转换时,它会抱怨,因为您将强制转换和未签名的值转换为已签名


此外,指针的大小因平台而异,因此32位指针比64位指针小。因此,如果指针是8字节的无符号指针,则将其向下转换为4字节的有符号指针。

uintptpr\u t
并不是用于中间转换到
int
。如果它是在系统上定义的(您的系统似乎已经定义了它),则它是无符号整数类型,在使用指针值加载时不会丢失信息。因此,如果必须,请完全使用
uintprt\u t
而不是
int
。但这应该是罕见的情况,在大多数情况下,我敢打赌,这只是一个坏设计的迹象


无论如何,
int
从一开始就是个坏主意。如果有什么区别的话,指针值只是虚拟内存空间中的一个位置,而将其视为有符号的值对我来说毫无意义。

你希望
i
的值是什么?你在任何示例中都不会取消引用
p
。你能澄清一下你的问题吗?谢谢你的澄清,但是为什么第三个例子没有任何错误呢?@Hamza Yerlikaya:首先,你的例子都没有产生任何错误(即使它们本应该产生错误)。他们发出了警告。其次,警告是不言自明的:
int
的大小与
int*
的大小不同。
uintpttr\u t
的大小与
int*
的大小相同,因此在这种情况下没有警告。