C中有效指针操作的问题

时间:2016-06-02 15:59:32

标签: c pointers linked-list operations

在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,不是非法的。

2 个答案:

答案 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 */

然而,指针算法受到更多限制。