【问题标题】:Casting of pointers in CC中的指针转换
【发布时间】:2021-07-11 04:24:49
【问题描述】:

谁能解释一下这两行是什么意思?

short * two_byte_pointer = (short*) 10;

int * four_byte_pointer = (int*) 10;

我以为我们只能在等号前使用int*。但是怎么可能用short* 投射一个数字呢?你能解释一下指针是如何在 C 中转换的吗?

【问题讨论】:

  • 我不确定它们是否是有效的说明,首先。
  • 指针本质上描述了内存地址。转换为指针类型意味着“获取该值并将其视为内存地址”。所以(short*)10 的意思是“10 是一个内存地址,其中存储了short 类型的值”
  • 我认为这会导致分段错误,因为您不允许访问位置 10 的内存。
  • @JHBonarius - 这在 Windows 和其他现代操作系统上绝对正确。但嵌入式系统是另一种野兽。
  • @klutt:将整数转换为指针并不是未定义的行为。 C 2018 6.3.2.3 5 允许。

标签: c pointers casting


【解决方案1】:

您的代码(例如第一行)意味着:

亲爱的编译器,这里有一个指向短 short * 的指针。
它被命名为two_byte_pointer
我希望它有一个赋值=
我正在考虑的价值是别的东西,但我希望你相信我,它是一个指向简短的指针 - 诚实的 (short*)
我使用的值是 10。

如果我是您的编译器或阅读代码的同事,我一个字也不会相信。并非没有一些解释性的 cmets 和对环境描述的记忆部分的引用。

在某些内存映射特殊寄存器位于不寻常位置的嵌入式环境中,这可能是有意义的。也许不是,请参阅下面的忙碌蜂的 cmets。
我很确定这只是一个非常理论的例子,“10”只是“一个数字例子”。

使用two_bytefour_byte 命名变量是基于对您环境中类型大小的假设。除此之外,我将其命名为pointer_to_two_byte,略长一点,更精确(此处不讨论命名风格)。

【讨论】:

  • (顺便说一句,我没有投反对票。;-) 如果转换的地址不符合与处理器相关的规范,则可能会出现对齐问题。 - 这种情况并不像你所说的那么理论化。并非每个编译器-链接器系统都具有扩展功能,例如 GCC,以提供干净的 C 解决方案来访问内存映射设备。但是,在 GCC 的 AVR 风格使用的 avrlibc 中,它们也使用强制转换。
【解决方案2】:

如果您强制转换某些内容,编译器只会获取您提供的任何值并将其解释为您将其转换为的类型。所以在本例中,它将10 解释为指向short 的指针。指针的值是它指向的内存地址。使用这个指针几乎肯定会失败,因为大多数系统不允许您访问如此低地址的内存。

如果您需要对地址进行计算并将结果用作指针,则将数字转换为指针会很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2021-06-06
    • 2021-09-20
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多