表达式
(void*)0
称为空指针。
但以下怎么样:
int i = 0;
void* s = (void*)i;
s
也是空指针吗? C 语言标准规定:
6.3.2.3 指针
3 值为 0 的整型常量表达式,这样的表达式 强制转换为 void * 类型,或者将预定义常量 nullptr 称为 a 空指针常量70)。如果空指针常量或值 类型 nullptr_t (必然是值 nullptr)被转换 对于指针类型,结果指针(称为空指针)是 保证与任何对象或函数的指针比较不相等。
4 将空指针转换为另一种指针类型会产生空值 该类型的指针。任意两个空指针比较相等。
5 安 整数可以转换为任何指针类型。除了之前的情况 指定的,结果是实现定义的,可能不是 正确对齐,可能不指向引用的实体 类型,并且在存储时可能会产生不确定的表示 进入一个物体。71)
根据这个
s
不会是一个空指针?
是的,s 是一个空指针。因为 (void*)i 等于 (void *)0,它是一个空指针。你可以这样检查:
gsm@fc:~/tmp$ gcc -std=c89 a.c
a.c: 在函数‘main’中:
a.c:6:15: 警告:将一个整数转换为大小不同的指针 [-Wint-to-pointer-cast]
6 | void* s = (void*)i;
| ^
gsm@fc:~/tmp$ ./a.out
s is null-pointer