也许我把人与我的例子混为一谈。我试图理解代码的一部分并简化它。这是原始代码的一部分(再次简化...... :))(见下面的原始帖子)。
<script language = "JavaScript">
location.href = "C:../mypage.html";
setTimeout("document.location = 'C:..mypage.html'",1000);
</script>
所以我想知道,他们为什么要施放已经是uint8_t的pbuf。但我想我现在已经得到了答案。
------------ OLD POST -------------
我正在探索Nordic Semiconductors nRF24LE1。
如果我有以下测试代码。
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) { }
}
printfs都给出了相同的答复。 做“varA式”的原因是什么?有必要的例子?
如果我在varA中使用方式,我不会收到警告“警告C260:'=':指针截断。
答案 0 :(得分:6)
您的三个示例基本上都是将指针转换为int
。从技术上讲,这需要在您的案例B
和C
中进行强制转换,并且您的编译器应该警告您。例如:
int varC = (int) test;
使用演员,这是完全有效的,但没有,不是。尽管如此,您的编译器可能生成相同的代码,无论是否。
但是,在示例代码中,表达式&test
的类型为int **
。将该类型的表达式转换为int *
并取消引用结果,就像为varA
赋值一样,旨在将test
的字节重新解释为一个int
,与C ++ reinterpret_cast
一样。这不一定产生与将test
直接转换为int
相同的值,就像为varC
指定值一样。如果指针的大小与目标系统上int
的大小不同,它们特别容易出现差异,但即使大小相同,它们也不需要产生相同的结果。< / p>
另一方面,将*
运算符直接应用于&
运算符的结果没有净效果,因此为varB
计算的值将可靠地与此相同为varC
计算。
答案 1 :(得分:1)
问题是任何指针类型都不需要与int
大小相同。编译器很遗憾地警告你这个事实。
使用(int *)(&test)
将测试的地址转换为指向int 的指针。
取消引用它会产生一个int
,可以很快地将其分配给int
变量。如果指针需要的位数多于int可以容纳的数量,那么它仍然可能会被截断,但是您确信编译器确实知道您在做什么并且它是按目的发生的。
答案 2 :(得分:1)
鉴于您的示例变量实际上是int
:
int varA;
int varB;
int varC;
如果没有使用GCC编译器版本4.4.7或更新版本并使用注释中所述的stdio.h
,代码将无法编译,由于非法类型'int'和',您的后两个语句将会出错指向int'
varA = *(int*)(&test); // The way it is done in the source code
varB = *(&test);//error
varC = test; //error
如果他们是int *
int *varA;
int *varB;
int *varC;
然后第一个语句:varA = *(int*)(&test);
会出错。
赋值语句编译的唯一方法是使用如下声明的变量:
int varA;
int *varB;
int *varC;
varA = *(int*)(&test); // The way it is done in the source code
varB = *(&test);
varC = test;
答案 3 :(得分:0)
varA = *(int*)(&test);
表示将test
的按位表示解释为int
,然后将其存储在var
中。
演员(int *)
表示test
的按位表示应解释为int
,而*
运算符将其解释为int
}。
如果memcpy(&varA, &test, sizeof varA);
,则与sizeof (int) == sizeof (int *)
相同。