C void指针和指针比较

时间:2012-06-29 22:10:49

标签: c pointers struct comparison void-pointers

我有以下函数从C:

中的链表中删除通用数据
void removeData(void *data, struct accList *theList)
{
    struct accListNode* cur = theList->head;
    struct accListNode* prev = NULL;

    for(; cur != NULL; prev = cur, cur = cur->next)
    {
        if(cur->data == data)
        {
            if(cur == theList->head)
            {
               theList->head = cur->next;
            }
            if(cur == theList->tail)
            {
                theList->tail = prev;
            }
            if(prev != NULL)
            {
                prev->next = cur->next;
            }
            free(cur);
            return;
        }
    }
}

cur->data == data背后的含义是什么?

由于我的数据是通用的(void*),这对于任何基本类型和任何结构类型意味着什么?

例如,考虑员工结构:

struct employee
{
    char name[20];
    float wageRate;
};

如果数据类型为cur->data == data,语句struct employee*如何工作? 由于数据是指向结构的第一个内存地址的指针,我只是比较指针地址?

4 个答案:

答案 0 :(得分:7)

cur->data == data

将指针cur->data与指针data进行比较。你要比较他们的价值,而不是他们的地址。指针是一个像任何其他变量一样的变量。它有一个地址(即&some_ptr)和一个值(即它所指的东西的地址)。

请注意,其他类型的比较(即< > >= <=)会导致未定义的行为,除非指针指向同一个数组或过去的一个元素结束(并不是说除非你知道他们指的是那些居住在同一块连续记忆中的“物体”,否则这样做会有意义,但仍然如此)。

答案 1 :(得分:3)

  

cur-&gt; data == data?

背后的含义是什么?

代码检查是两个指针都是相同的指针

  

由于我的数据是通用的(void *),这对任何原语都意味着什么   类型和任何结构类型?

     

如果数据属于类型,语句cur-&gt; data == data如何工作?   struct employee *?

没什么,比较效果相同

  

由于data是指向结构的第一个内存地址的指针   我只是比较指针地址?

不,你在比较指针

答案 2 :(得分:2)

你正在比较指针hotself,而不是指向的结构。

答案 3 :(得分:0)

我猜你没写过removeData()?如果没有,那么我的解释是:

removeData()用于从链表中删除特定条目(即*数据),而不是内容等于* data的条目。所以removeData()的调用者必须已经知道他们想要free()'ed的条目的确切位置。他们可以自己释放(),但这不会很好,因为链表仍然包含指向它的指针,并且可能是链表的其他用户会认为free()'ed对象仍然有效(他们会有没有理由不相信,没有任何其他告诉他们的计划)。

如果你想要一个函数在List中搜索其内容与* data的内容相匹配的条目(但与* data不在同一个内存中),那么你需要为每个条目写一个版本的removeData()这样的类型,你的accList要么是同构的(包含那种类型的所有对象),要么accList还需要包含每个条目类型的一些指示,可能作为枚举,每个版本的removeData()(一个对于每种类型)将需要跳过与其自身类型不匹配的元素。

相关问题