C void指针和指针比较

标签 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;
};

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

最佳答案

cur->data == data

比较指针cur->data指向指针 data .您是在比较它们的值,而不是它们的地址。指针和其他变量一样是一个变量。它有一个地址(即 &some_ptr )和一个值(即它所指事物的地址)。

请注意,其他类型的比较(即 < > >= <= )会导致未定义的行为,除非指针指向同一数组的元素或指向末尾的元素(不是它会使这样做是有意义的,除非你知道它们指向无论如何都驻留在同一 block 连续内存中的“对象”,但仍然如此)。

关于C void指针和指针比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269594/

相关文章:

c++ - 等价于 C++ 中结构初始化的 C 编程语言

c - 在C中删除字符串数组的前两个元素

c - Realloc() 不更改已分配内存的内存地址?

c - 用于静态代码分析的稀疏和覆盖工具有何不同?

c - 取消引用指向不完整类型的指针 [处理结构]

c - C 中的 "Dynamic Inheritance"

c - 在二叉搜索树中插入第二个节点时程序崩溃

c - 如何修改函数以满足OCP?

c - 指针(?)导致 C 程序崩溃

c - 指向 C 中数组的第一个元素