c - 什么是(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;
解决方案
(uint32_t*)
是演员表。强制转换是执行转换的运算符。
在这段代码中,&CmdBuffer[CmdBuffer_Index]
是一个指向 中特定元素的指针CmdBuffer
,该指针的类型是“指向 ”的指针uint8_t
,也写成uint8_t *
。此强制转换将其转换为指向 a 的指针uint32_t
,也写为uint32_t *
。
然后*pBuffcmd = cmd;
尝试将值写入转换后的指针cmd
所uint32_t
指向的值。
这是糟糕的代码。C 标准不保证将 a 转换uint8_t *
为 auint32_t *
会起作用。即使这确实有效,C 标准也不保证使用uint32_t
引用来写入以元素类型定义的数组中的字节uint8_t
将有效。可能此代码是为特定的 C 实现而设计的,但可以使用标准 C 代码获得所需的结果:
memcpy(&CmdBuffer[CmdBuffer_Index], &cmd, sizeof cmd);
推荐阅读
- sql - Unlock a table of a ingres database
- java - sonar null pointer exception in java piece of code
- php - Curl returns empty response on the first api call, but return response on the second call
- scala - How to resolve a 'Type mismatch' error in scala?
- c++ - I cannot solve the else part in my if-else ladder?
- android - 单击侦听器在 viewpager 之外不起作用
- mysql - 可以用mysql和innodb实现悲观锁吗?
- angular - cdkPortal 与 ngTemplateOutlet 有何不同
- jquery-ui - 将类添加到日期选择器
- python - 在Django中将变量从视图传递到表单