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

Ste*_*eve 1 c struct pointers function 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);
}
Run Code Online (Sandbox Code Playgroud)

我有一个结构:

typedef struct video
{
    char title[MAX_TITLE_LENGTH];
    struct video *prev;
    struct video *next;
}video;
Run Code Online (Sandbox Code Playgroud)

插入原型:

int insert (char *title, video **head, video **tail);
Run Code Online (Sandbox Code Playgroud)

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

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

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

有人可以把它放松吗?

谢谢.

pb2*_*b2q 5

这是因为该功能insert可能需要什么样的变化head,并tail.

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

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

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