作为 C 的新手,我很困惑何时投射指针实际上是可以的。
据我了解,您几乎可以将任何指针类型转换为任何其他类型,编译器会让您这样做。例如:
int a = 5;
int* intPtr = &a;
char* charPtr = (char*) intPtr;
但是,通常这会调用未定义的行为(尽管它恰好在许多平台上工作)。这就是说,似乎有一些例外:
- 你可以
void*
自由地来回投射(?) - 你可以
char*
自由地来回投射(?)
(至少我在代码中见过它......)。
那么指针类型之间的哪些强制转换不是C 中未定义的行为?
编辑:
我尝试研究 C 标准(“6.3.2.3 指针”部分,位于http://c0x.coding-guidelines.com/6.3.2.3.html),但除了关于void*
.
编辑2:
只是为了澄清:我明确地只询问“正常”指针,即不询问函数指针。我意识到转换函数指针的规则非常严格。事实上,我已经问过这个问题了:-):如果我转换一个函数指针,改变参数的数量会发生什么