*p
应该是这样的一个空左值,除非我们尝试访问这个左值背后的(不存在的)内存位置(例如通过执行左值到右值转换),否则所有其他操作都会像预期的那样工作。例如,&*p
等同于p
,除非p
无效。 (这也适用于数组末尾后面的指针,这对于常见的习语&arr[n]
是必要的)。null
视为这样的实体,那么许多问题都可以得到解决。如果我们认识到指针可以指向对象的起始点和/或结束点(例如对于int foo[10]
,指针foo+1
将指向第一个元素的末尾和第二个元素的起始点,而foo+10
只会指向第十个元素的末尾),并且指向不同对象的指针必须是不同的,除了指向一个对象起始点的指针可能指向另一个对象的末尾。 - supercat
operator*
的静态类型,而link1在我看来也是一致的。 - drRobertz