链表上的指针问题

时间:2018-12-09 16:25:27

标签: c pointers linked-list

作为C语言的大多数初学者,我正在实现一个简单的链表。

列表的每个节点定义如下:

typedef struct list_node {
    void * data;
    struct list_node * next;
} list_node_t;

我制作了一个测试程序来创建和迭代列表。创建和插入操作正常工作。但是,下面的代码给我带来了问题:

list_node_t * node = NULL;

list_iter_reset(list, node);

if (node == NULL) {
    printf("Node is NULL.\n");
} else {
    printf("Node is not NULL.\n");
}
fflush(stdout);

函数list_iter_reset()在下面定义。请注意,list->head并不指向NULL,因为我之前已经在列表中插入了节点。

void list_iter_reset(list_t list, list_node_t * node)
{
    node = list->head;

    if (node == NULL) {
        printf("Node is NULL.\n");
    } else {
        printf("Node is not NULL.\n");
    }
    fflush(stdout);
}

执行该代码的输出如下:

Node is not NULL.
Node is NULL.

由于我要传递指向该函数节点的指针,为什么在该函数调用之后测试程序中创建的节点仍指向NULL?

我想这里有一个简单的指针算术方面。我一直到处逛逛,找不到类似的问题。

谢谢。

1 个答案:

答案 0 :(得分:1)

该函数正在修改指针的值,但是永远不会返回到调用者。似乎您想将 pointer to pointer list_node_t**)传递给函数,而不是常规指针。

void list_iter_reset(list_t list, list_node_t** node)
{
    *node = list->head;

    ...
}

这样做的理由是,虽然只需要一个指针即可更改它所指向的事物的值,但是在这里您尝试更改指针本身的值< / em>,即此指针指向的位置。

作为比较,假设您将int传递给函数,并期望函数修改该int。您当然必须通过int*,对吗?这是同一件事,除了将int替换为node*,因此您需要传递一个指向该类型的指针,本例中为node**