为什么从结构中传出指针需要额外的解引用?

时间:2012-08-27 21:07:30

标签: c function pointers struct dereference

我正在使用C中的双链表,我发现了一些我意识到我总是被接受为事实或曾经知道答案并且现在已经忘记的事情。当我再次开始使用指针时,这经常发生在我身上,每次我都不得不重新学习它们。

以下是我的设置的基础知识:

int main(void)
{
    video *head = NULL;
    video *tail = NULL;

    char *buffer = NULL;
    buffer = (char*)malloc(sizeof(MAX_TITLE_LENGTH));

    printf("Enter a title: ");
    fgets(buffer, MAX_TITLE_LENGTH, stdin);

    insert(buffer, &head, &tail);
}

我有一个结构:

typedef struct video
{
    char title[MAX_TITLE_LENGTH];
    struct video *prev;
    struct video *next;
}video;

插入原型:

int insert (char *title, video **head, video **tail);

我想知道为什么我必须专门传递视频*的地址。

我知道传递char的方式,它传递字符串开头的内存地址。为什么我必须再次引用头部和尾部来访问它们的值?

老实说,这比我想象的要简单得多,我很确定,而且我的大脑处于一个考虑指针的坏点。

任何人都可以放松它吗?

感谢。

1 个答案:

答案 0 :(得分:5)

这是因为函数insert可能需要更改headtail指向

请记住,在C中,函数参数是按值传递的。这就是你将一个指针传递给你想在函数中改变的struct的原因:提供一个指针允许你的函数访问内存中的实际结构。

但是struct的指针是按值传递的。如果要更改指向的指针,该怎么办?您需要一个额外的引用级别,或实际保存指针的内存,以便不会简单地复制它。使用附加级别if引用,您将可以访问指针以在函数中更改它,并且可以使指针指向其他内容。

您经常会在链表代码中看到这一点,需要修改例如head元素:列表中的所有其他元素 - 可能 - 可以通过使用列表中每个节点中包含的指针来访问,但是如果需要,例如在头部插入一个新元素,你的函数需要更改头部指针。如果将其作为函数参数传递,则需要它的地址,否则该函数只会更改副本,并且更改不会反映在函数外部。