首页 > 解决方案 > 什么是(uint32_t*)?

问题描述

我是C新手。我不明白如何解决以下代码的最后两行,你能解释一下吗?非常感谢您。

pBuffcmd = (uint32_t*)&CmdBuffer[CmdBuffer_Index]; *pBuffcmd = cmd;

#DL_SIZE                  (8*1024L)
#define CMD_FIFO_SIZE     (4*1024L)
#define CMD_SIZE          (4)/

uint32_t CmdBuffer_Index;
volatile uint32_t DlBuffer_Index;

uint8_t  DlBuffer[DL_SIZE];
uint8_t  CmdBuffer[CMD_FIFO_SIZE];

void App_WrCoCmd_Buffer(Gpu_Hal_Context_t *phost,uint32_t cmd)
{
#ifdef  BUFFER_OPTIMIZATION

    uint32_t *pBuffcmd;

    if (CmdBuffer_Index >= CMD_FIFO_SIZE) 
    {
        if (CmdBuffer_Index > 0) {
            NOP;
        }
        CmdBuffer_Index = 0;
    }
    pBuffcmd = (uint32_t*)&CmdBuffer[CmdBuffer_Index];
    *pBuffcmd = cmd;

标签: c

解决方案


(uint32_t*)演员表。强制转换是执行转换的运算符。

在这段代码中,&CmdBuffer[CmdBuffer_Index]是一个指向 中特定元素的指针CmdBuffer,该指针的类型是“指向 ”的指针uint8_t,也写成uint8_t *。此强制转换将其转换为指向 a 的指针uint32_t,也写为uint32_t *

然后*pBuffcmd = cmd;尝试将值写入转换后的指针cmduint32_t指向的值。

这是糟糕的代码。C 标准不保证将 a 转换uint8_t *为 auint32_t *会起作用。即使这确实有效,C 标准也不保证使用uint32_t引用来写入以元素类型定义的数组中的字节uint8_t将有效。可能此代码是为特定的 C 实现而设计的,但可以使用标准 C 代码获得所需的结果:

memcpy(&CmdBuffer[CmdBuffer_Index], &cmd, sizeof cmd);

推荐阅读