指针转换

指针转换是在使用指针时执行的,包括指针分配,初始化和比较。

C 仅 C 开头。

涉及指针的转换必须使用显式类型强制类型转换。 此规则的例外情况是 C 指针允许的赋值转换。 在下表中, const限定的 lvalue 不能用作赋值的左操作数。
表 1. C 指针的合法分配转换
左操作数类型 允许的右操作数类型
指向 (对象) T 的指针
  • 常量 0
  • 指向与 T 兼容的类型的指针
  • 指向 void (void*) 的指针
指向 (函数) F 的指针
  • 常量 0
  • 指向与 F 兼容的函数的指针
左操作数的引用类型必须与右操作数具有相同的限定符。 如果另一个指针的类型为 void*,那么对象指针可能是不完整的类型。

C 仅 C 结束。

零常量到空指针
求值为零的常量表达式是 空指针常量。 此表达式可以转换为指针。 此指针将为空指针 (具有零值的指针) ,并且保证不指向任何对象。 仅限 C + + 求值为零的常量表达式也可以转换为指向成员的空指针。
数组到指针
类型为 "数组 N" 的 lvalue 或 rvalue ,其中 N 是数组的单个元素的类型,对于 N*。 结果是指向数组的初始元素的指针。 如果表达式用作 & (地址) 运算符或 sizeof 运算符的操作数,那么无法执行转换。
函数到指针

除表达式用作 & (地址) 运算符, () (函数调用) 运算符或 sizeof 运算符的操作数外,可以将作为函数的 lvalue 转换为作为指向相同类型的函数的指针的 rvalue。