我正在使用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的方式,它传递字符串开头的内存地址。为什么我必须第二次取消引用头部和尾部才能访问它们的值?
老实说,这比我想象的要简单,我确信这一点,我的大脑在思考指针时陷入了困境。
有人能把它震松吗?
谢谢。
这是因为函数insert
可能需要将head
和tail
指向的内容更改为。
请记住,在C中,函数参数是按值传递的。这就是为什么要将指针传递给要在函数中更改的struct
:提供指针可以让函数访问内存中的实际结构。
但指向struct
的指针是通过值传递的。如果您想更改指针指向的内容,该怎么办?您需要一个额外的引用级别,或者实际保存指针的内存,这样它就不会被简单地复制。使用附加的if引用级别,您可以访问指针以在函数中更改它,并可以使指针指向其他对象。
你经常会在链表代码中看到这一点,它需要修改例如head
元素:列表中的所有其他元素都可以通过使用列表中每个节点中包含的指针来访问,但如果你需要在头部插入一个新元素,你的函数将需要更改头部指针。如果您将其作为函数参数传入,则需要它的地址,否则函数只会更改一个副本,并且这些更改不会反映在函数之外。