简体   繁体   中英

What is (uint32_t*)?

I am new to C. I don't understand how to solve the last two lines of the following code, can you explain it? thank you very much.

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;

(uint32_t*) is a cast . A cast is an operator that performs a conversion.

In this code, &CmdBuffer[CmdBuffer_Index] is a pointer to a particular element in CmdBuffer , and the type of that pointer is “pointer to uint8_t ”, also written uint8_t * . This cast converts it to a pointer to a uint32_t , also written uint32_t * .

Then *pBuffcmd = cmd; attempts to write the value cmd to the uint32_t pointed to by the converted pointer.

This is bad code. The C standard does not guarantee that converting a uint8_t * to a uint32_t * will work. Even if that does work, the C standard does not guarantee that using a uint32_t reference to write to bytes in an array defined with element type uint8_t will work. It may be this code is designed for a particular C implementation in which that will work, but the desired result could be obtained using standard C code:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM