gpt4 book ai didi

c++ - 指针算术题

转载 作者:太空宇宙 更新时间:2023-11-04 01:14:40 24 4
gpt4 key购买 nike

有人可以向我解释一下,以下两行代码中发生了什么吗?假设我们在 32 位机器上工作

p - 是指针

(*(long *)((char **)(p) - 1))
(*(int *)((int)(p) - 4))

我唯一理解的是,*(long *) 将“某物”转换为 long 类型的指针,然后取消引用。获取值(value)。

谢谢!

最佳答案

(*(long *)((char **)(p) - 1))

从指针p开始。将其转换为类型 (char **)。从中减去一个。将结果转换为类型 (long *),然后取消对结果的引用。换句话说,将指针移动一个字节,并获取存储在该地址的 long 的值。此操作在某些平台上很可能会被破坏,尤其是取决于 p 的类型。

(*(int *)((int)(p) - 4))

从指针p开始。将其转换为 int。减法 4. 将其转换为 (int*),并取消对结果的引用。现在,不是进行正常的指针运算,而是直接将指针值作为整数摆弄,将其移动四位,然后读取结果指向的 int。此操作在某些系统上也会被破坏。

我想我设法解析了它而没有迷失在括号中。无论如何,不​​要这样做。这是病态的。可能会有一些奇怪的嵌入式开发任务,您认为这样的事情是个好主意。如果是这样,永远不要承认自己做过。被发现了就怪罪别人。

例如,对于第二个示例,将 p 作为 int*,并且在具有 8 位字符和 32 位整数的系统上,您基本上完成了 *(p-1)

OTOH,在具有 16 位 int 的机器上,您正在做 *(p-2),而在具有 64 位 int 的机器上,您正在做 *(p-0.5),这是不明智的,并且可能会在提示未对齐的内存访问时崩溃。 (它应该崩溃。)使用实际指向正确类型的指针,你永远不应该有理由做这种无意义的事情。

关于c++ - 指针算术题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4457806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com