比较指针以确定对象身份
给定两个指针 a 和 b,确定它们是否引用同一个对象是常见的编程需求。直观的方法是使用相等运算符 (==)。本文探讨了这种方法的有效性,并提供了来自 C 标准的更多见解。
相等运算符和指针比较
根据 C 11 标准,可以比较相同类型的指针相等,有特定规则:
- 如果两个指针都指向同一个对象或函数,或者都有空值,则它们相等(a == b)。
- 如果任一指针指向虚拟成员函数,则结果未指定。
- 如果指针引用不是同一对象的成员的不同对象或数组元素,相等比较未指定。
这意味着如果 a 和 b 指向同一个对象或具有 null,则 a == b 成立
关系运算符和指针
关系运算符(、=)有一组独特的指针比较规则:
- 如果 p 和 q 指向同一个对象或超过同一个数组的末尾,或者两者都为 null,则比较 p = q 产生 true,而 p
- 如果 p 和 q 指向不同的对象,且不是同一对象或数组元素的成员,或者只有一个为 null,则 p = q 未指定。
对代码的影响
对于您的特定情况,如果 a 和 b 都分配了某些值, a == b 将指示它们是否指向同一个对象。但是,需要注意的是,如果某些内容引用了不相关的不同对象(例如,不同函数中的变量或不同作用域中的数组),则此比较可能会产生未指定的结果。
标准库的其他见解
C 标准库提供了用于比较指针的附加工具:
-
专业化: 标准库专业化
和>指针类型提供全序,即使内置运算符不提供全序。这意味着您可以将任何 void* 指针与 std::less 进行比较。和朋友们,确保良好定义的排序。
结论
使用相等运算符 == 比较指针可能是确定对象身份的有用技术,但至关重要的是请注意 C 标准中指定的潜在警告和限制。如果比较结果处于未指定的条件,则可能需要替代方法,例如手动跟踪对象关系或使用自定义比较函数。
以上是在 C 中使用'==”比较指针来确定对象身份有多可靠?的详细内容。更多信息请关注PHP中文网其他相关文章!