1

我正在使用 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);

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

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

老实说,这比我想象的要简单,我确信这一点,而且我的大脑在考虑指针时处于一个糟糕的位置。

谁能把它弄松?

谢谢。

4

1 回答 1

5

这是因为该函数insert可能需要更改whatheadtail指向.

请记住,在 C 中,函数参数是按值传递的。这就是为什么您将指针传递给struct要在函数中更改的 a:提供指针允许您的函数访问内存中的实际结构。

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

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

于 2012-08-27T21:08:29.127 回答