简单赋值运算中涉及指针的隐式类型转换
ISO/IEC 9899:2018标准第6.5.16.1 Simple assignment节涉及的指针类型转换,即简单赋值运算中涉及指针的隐式类型转换,具体如下:
- 左操作数是指针类型,右操作数是空指针常量(null pointer constant),空指针常量可以隐式地转换成任何指针类型。
C语言中值为0的整型常量表达式或者转换为void *类型的此类表达式称为空指针常量。在<stddef.h>等头文件中定义宏NULL作为空指针常量。如果空指针常量转换成指针类型,生成的指针称为空指针。空指针与任何对象指针或者函数指针都不相等。将空指针转换为另一种指针类型会产生该类型的空指针。任意两个空指针都是相等的。
下列赋值语句都是合法的。
int *intP; float *floatP; intP = NULL; floatP = NULL; intP = 0; floatP = 0; intP = (void *)0; floatP = (void *)0;
赋值后对应的指针均为空指针。
- 左操作数是_Bool类型,右操作数是指针类型,如果右操作数是空指针,左操作数的值为0;否则左操作数的值为1。
_Bool b1, b2; int a; int *ptr1 = NULL; int *ptr2 = &a; b1 = ptr1; //b1的值为0。 b2 = ptr2; //b2的值为1。
- 左操作数具有原子、限定或者非限定指针类型,左操作数和右操作数都是指向兼容类型的限定或者非限定版本的指针,并且左操作数具有右操作数所具有的所有类型限定符(type qualifier)。
int a; int *ptr = &a; const int *constPtr; constPtr = ptr; //合法。 ptr = constPtr; //不合法。
- 左操作数具有原子、限定或者非限定指针类型,一个操作数是指向对象类型的指针,另一个操作数是指向void类型的限定或者非限定版本的指针,并且左操作数具有右操作数所具有的所有类型限定符(type qualifier)。
int a; int *ptr = &a; void *voidPtr; voidPtr = ptr; //合法。 ptr = voidPtr; //合法。