GCC编译器能否正确处理以下内容?C中指针和整数之间的有意比较
uint32 fn(uint32 adr, uint8 *ptr) {
return (ptr==adr);
}
换句话说它会自动将ptr转换为一个整数来存储指向的内存地址吗?
GCC编译器能否正确处理以下内容?C中指针和整数之间的有意比较
uint32 fn(uint32 adr, uint8 *ptr) {
return (ptr==adr);
}
换句话说它会自动将ptr转换为一个整数来存储指向的内存地址吗?
是的,GCC会正确处理它 - 通过诊断代码中的错误。
C在整数类型和指针类型之间没有隐式转换(除了整数常量0
的特例被视为空指针常量),==
无法比较整数和指针类型的值。
要纠正这个错误,加铸(显式转换)转换adr
键入uint8*
:
return ptr == (uint8*)adr;
,或者甚至更好,使同一类型的两个参数在首位:
uint32 fn(uint8 *adr, uint8 *ptr) {
return ptr == adr;
}
除非你有一些特定的原因,adr
需要是一个整数而不是一个指针,但你没有告诉我们可能是什么原因。
C是更强类型,很多人认为它是。
我希望它将ptr转换为int32,而不是adr转换为uint8 *。我只是施展它。 –
@DamienHoreau:为什么你转换成其他类型的是哪一个? (你的意思是'uint32',而不是'int32',对吧?) –
这个无意义的情况怎么可能被“正确地处理”呢? – 2013-09-27 16:15:34
它不是'无意义的案例'。我对使用PIC32的定制仪器进行编程,以管理外部RAM/NVM以及PIC内存中的数据。这意味着整数地址和指针的混合。它工作得很好。我只想了解编译器是否将指针转换为表示指向地址的整数。 –
也许会。或者也许不会。如果你想符合要求,你可以明确地进行演员阵容。 – 2013-09-27 16:24:05