在K& R中,它表示有效指针操作是指定相同类型的指针,添加或减去相同的数组......所有其他指针算术都是非法的。
然而,当我阅读维基百科上的双链表的代码时,它会比较两个指向链表不同节点的指针。它让我很困惑。 这是代码
unsigned int DetectCycleinList(void)
{
DoublLinkedList* pCurrent = pHead;
DoublLinkedList* pFast = pCurrent;
unsigned int cycle = FALSE;
while ((cycle == false) && pCurrent->pNext != NULL)
{
if (!(pFast = pFast->pNext))
{
cycle = false;
break;
}
else if (pFast == pCurrent)
{
cycle = true;
break;
}
else if (!(pFast = pFast->pNext))
{
cycle = false;
break;
}
else if (pFast == pCurrent)
{
cycle = true;
break;
}
pCurrent = pCurrent->pNext;
}
}
它比较pFast和pCurrent,不是非法的。
答案 0 :(得分:2)
根据N1570,没有限制要比较的两个指针必须指向同一个数组中的元素。
pCurrent
和{
_id: String,
companyName: String,
address: String,
employees: [Employee],
...
}
指向的是相同类型的对象,因此比较它们是合法的。
来自N1570的报价6.5.9平等运营商:
约束
2以下其中一项应持有:
- 两个操作数都有算术类型;
- 两个操作数都是指向兼容类型的合格或非限定版本的指针;
- 一个操作数是指向对象类型的指针,另一个是指向限定符号或指针的指针 不合格的版本;或
- 一个操作数是指针,另一个是空指针常量。[...]
6当且仅当两者都是空指针时,两个指针比较相等, 两者都是指向同一对象的指针(包括指向对象的指针) 以及它的开头的一个子对象)或函数,都是指针 一个超过同一个数组对象的最后一个元素,或者一个是a 指向一个数组对象末尾的指针,另一个指向 指向恰好发生的另一个数组对象的开始的指针 紧跟地址空间中的第一个数组对象。
答案 1 :(得分:0)
两个指针之间可能会发生比较。例如,如果要检查指针p
是否指向数组a
的第一个元素:
if (p == a)
/* a points to the start of a */
然而,指针算法受到更多限制。