表达式
(void *)0
称为空指针。
但以下怎么样:
int i = 0;
void *s = (void *)i;
s
也是空指针吗? C 语言标准规定:
6.3.2.3 指针
3 值为 0 的整型常量表达式,例如转换为 void * 类型的表达式,或预定义常量 nullptr 称为空指针常量70)。如果将空指针常量或 nullptr_t 类型的值(必然是值 nullptr)转换为指针类型,则生成的指针(称为空指针)保证与任何对象或函数的指针比较不相等。
4 将空指针转换为另一种指针类型会产生空值 该类型的指针。任意两个空指针比较相等。
5 整数可以转换为任何指针类型。除前面指定的情况外,结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且在存储到对象中时可能会产生不确定的表示。71)
照这个
s
不会是空指针吧?
是的,s 是一个空指针。因为 (void*)i 等于 (void *)0,它是一个空指针。你可以这样检查:
gsm@fc:~/tmp$ cat a.c
#include <stdio.h>
int main()
{
int i = 0;
void* s = (void*)i;
printf("s %s null-pointer\n", s==NULL ? "is" : "isn't");
return 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