【问题标题】:what pointer magic is this这是什么指针魔法
【发布时间】:2016-05-15 17:33:49
【问题描述】:

我正在学习C。我开始理解指针和类型转换。我正在遵循一些指南和示例,并且遇到了这个声明:

uint32_t *sp;
...
*(uint32_t*)sp = (uint32_t)somevalue;

这里发生了什么?第一个星号对我来说是个谜。

【问题讨论】:

  • 第一个演员表是多余的。如果它是某个正整数,也可能是第二个。
  • 强制转换为uint32_t* 是不必要的,因为它已经与sp 相同,所以代码等同于*sp = (uint32_t)somevalue;(这使它看起来不那么神奇)。
  • 显然作者讨厌他的编译器,更喜欢不进行自动类型检查。 IOW:阅读其他代码进行学习。

标签: c pointers casting dereference


【解决方案1】:

分解:

*(uint32_t*)sp 

基本上说将sp 视为指向uint32_t 的指针((uint32_t *) 是一个转换表达式),并取消引用结果。

所以,

*(uint32_t*)sp = (uint32_t)somevalue;

的意思是,“获取somevalue,将其转换为uint32_t,并将结果存储到sp 指向的事物中,并将其视为uint32_t。”

请注意,sp 上的演员表是多余的;您已经将其声明为指向uint32_t 的指针,因此该赋值可以写为

*sp = (uint32_t) somevalue;

【讨论】:

    【解决方案2】:

    第一个星号取消引用 sp 指针,以便将 somevalue 的值分配给指针对象。

    我想知道为什么演员,因为这个

    *sp = (uint32_t) somevalue;
    

    如果spuint32_t * 类型就可以了。

    【讨论】:

      【解决方案3】:

      在将sp 强制转换为指向uint32_t 的指针后,第一个星号取消引用somevalue,以便将somevalue 写入该位置。

      但是,强制转换是不必要的,因为sp 已经是指向uint32_t 的指针。此外,如果somevalue 是数字类型,则右侧的强制转换也是不必要的,因为右值将被隐式强制转换为左值的类型。

      【讨论】:

        【解决方案4】:

        第一个星号是indirection operator

        基本上就是在指针持有的地址获取/访问

        引用C11 标准,第 §6.5.3.2 章,地址和间接运算符

        一元* 运算符的操作数应具有指针类型。

        一元* 运算符表示间接。如果操作数指向一个函数,则结果为 功能指示符;如果它指向一个对象,则结果是一个左值,指定 目的。 [...]

        【讨论】:

          【解决方案5】:

          你的困惑源于这不是一个声明,而是一个赋值语句:

          /* This is the declaration of sp as a pointer to uint32_t */
          uint32_t *sp;
          
          /* This is an assignment statement setting *sp to somevalue */
          *(uint32_t*)sp = (uint32_t) somevalue;
          

          它看起来像一个声明,因为不必要的左值转换使它看起来像是在声明类型。

          【讨论】:

            猜你喜欢
            • 2013-02-04
            • 2012-05-14
            • 2023-03-18
            • 2022-06-14
            • 1970-01-01
            • 2011-05-19
            • 1970-01-01
            • 2012-01-10
            相关资源
            最近更新 更多