也许我把人与我的例子搞混了.我试图理解代码的一部分并简化它.这是原始代码的一部分(再次简化...... :))(见下面的原始帖子).
uint16_t hal_nrf_read_multibyte_reg(uint8_t *pbuf)
{
uint8_t memtype;
memtype = *(uint8_t*)(&pbuf);
if (memtype == 0x00U)
{
uint8_t data *buf = (uint8_t data *)pbuf;
DOTHIS
}
if (memtype == 0x01U)
{
uint8_t xdata *buf = (uint8_t data *)pbuf;
DOTHAT
}
if (memtype == 0xFEU)
{
uint8_t pdata *buf = (uint8_t data *)pbuf;
DOSOMETHING
}
return SOMETHING;
}
void main()
{
uint8_t payload[3];
hal_nrf_read_multibyte_reg(payload);
while(1) { }
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道,他们为什么要施放已经是uint8_t的pbuf.但我想我现在得到了答案.
------------旧帖子-------------
我正在探索Nordic Semiconductors nRF24LE1.
如果我有以下测试代码.
void tempF(int *test)
{
int varA;
int varB;
int varC;
varA = *(int*)(&test); // The way it is done in the source code
varB = *(&test);
varC = test;
printf("A: %x\n", varA);
printf("B: %x\n", varB);
printf("C: %x\n", varC);
printf("C1: %x\n", test);
if (test == 0x00)
printf("equals 0x00");
}
int main(void) {
int myArray[3];
tempF(myArray);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
printfs都给出了相同的答复.做"varA式"的原因是什么?有必要的例子?
如果我在varA中使用方式,我不会收到警告"警告C260:'=':指针截断.
你的三个样本基本上都是将一个指针转换为一个int.从技术上讲,这需要在你的情况下,投B与C,和你的编译器应该提醒你一下.例如:
int varC = (int) test;
Run Code Online (Sandbox Code Playgroud)
演员阵容,这是完全有效的,但没有,没有.然而,您的编译器可能生成相同的代码,无论是否.
但是,在示例代码中,表达式的类型&test是int **.铸造该类型的表达到int *和解除引用的结果,如做是为了将值分配给varA,旨在具有重新解释的字节的效果test的那些的int,如用C++ reinterpret_cast.这不一定产生与test直接转换为a 相同的值int,就像分配值一样varC.如果指针的大小int与目标系统上的大小不同,它们特别容易出现差异,但即使大小相同,它们也不需要产生相同的结果.
另一方面,将*运算符直接应用于运算符的结果&没有净效果,因此计算的值varB将可靠地与计算的值相同varC.