Pav*_*kin 5 c pointers terminology language-lawyer
在阅读 C11 标准时,我对术语“指向对象的指针”和“指向对象类型的指针”的含义以及在标准中使用这些术语的一致性感到困惑。
根据我的理解:
这种理解正确吗?
现在考虑 C11,6.3.2.3p7(添加了强调):
指向对象类型的指针可以转换为指向不同对象类型的指针。如果生成的指针未针对引用类型正确对齐 68),则行为未定义。否则,当再次转换回来时,结果应等于原始指针。当指向对象的指针转换为指向字符类型的指针时,结果指向该对象的最低寻址字节。
在这里我们看到术语“指向对象类型的指针”和“指向对象的指针”都与相同的动词“转换”一起使用。那么,到底转换了什么:指针的值还是指针本身?
另一个例子:C11,6.5.6p7(强调):
就这些运算符的目的而言,指向不是数组元素的对象的指针的行为与指向长度为 1 的数组的第一个元素的指针相同,且对象的类型作为其元素类型。
考虑 C11,6.5.6p7(添加强调):
int* x[1];
Run Code Online (Sandbox Code Playgroud)
数组到底x包含什么:“指向对象的指针”或“指向对象类型的指针”?
UPD。在尝试使用指向非对象类型的指针时,发现 ICC 和 MSVC 缺乏对约束违规的诊断生成: https: //godbolt.org/z/77Y5snM4K。
“指向对象类型的指针”谈论的是在编译时确定的指针类型。对象类型是除函数类型(C11 6.2.5 类型/1)以外的任何类型,因此它们意味着指向函数以外的任何类型的指针。
“指向某某对象的指针”谈论的是指针的运行时值(它指向哪个对象)。“指向一个对象”意味着指针不是悬空的。