【问题标题】:Why Does Passing Pointers from Structs Require an Extra Dereference?为什么从结构中传递指针需要额外的取消引用?
【发布时间】:2012-08-22 09:23:54
【问题描述】:

我正在使用 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 的方式是传递字符串开头的内存地址。为什么我必须再次取消引用 head 和 tail 才能访问它们的值?

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

谁能把它弄松?

谢谢。

【问题讨论】:

    标签: c function pointers struct dereference


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我现在真的明白了。感谢您花时间回答这么好的答案。我正在修改我的旧双链表代码以保存其他内容,但我忘记了它是如何工作的,所以你很高兴,这正是它的用途!
    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2011-02-04
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多