gpt4 book ai didi

c - 如何将空指针(结构返回类型)更改为声明的结构?

转载 作者:行者123 更新时间:2023-11-30 18:17:18 24 4
gpt4 key购买 nike

我是 C 编程新手。我正在尝试自己实现链表。我遇到了指针问题

我有功能

void Insert(Node* head, int x)

在链表的开头插入节点。问题是,当我插入第一个节点并且 Node *head 为 NULL 时,函数 Insert 无法将空指针的指针地址更改为新创建的节点。看起来 Node *head 是按值传递的,而不是按引用传递的。 下面提供了代码。为了调试地址在整个执行过程中如何变化,我使用了 printf 函数。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct Node {
int data;
struct Node *next;
} Node;

int main() {
Node *head = (Node*) malloc(sizeof(Node));
head = NULL;

printf("head in main(): %d\n", head); // For example: 100

Insert(head, 25);
return 0;
}

void Insert(Node *head, int x) {
Node *temp = (Node*) malloc(sizeof(Node));
temp->data = x;
temp->next = head;

printf("temp->next address: %d\n", temp->next); // also 100

head = temp;

printf("%d\n", head); // not 100, something else i.e 200
}

最佳答案

It seems as if the Node *head is passed by value and not by reference.

这是完全正确的——在 C 中,每个参数总是按值传递。 指针是一个值,并且该值是按值传递的,并且调用

Insert(head, 25);

永远无法更改名为head 的变量的。它读取变量的值(该值是空指针),将该值赋予函数,并且不再触及变量 head无论该函数的作用是什么。

(请注意,在您的程序中,您有两个名为 head 的变量 - 一个在 main() 中,另一个在 Insert()。当函数返回时,Insert() 中的变量会默默消失;没有任何东西会自动尝试将其值复制到 main() 中的类似名称的变量) .

如果你想(概念上)通过引用传递head,你需要实际传递一个指向它的指针——在这种情况下,一个指向一个指针!您需要将您的函数声明为

void Insert(Node **head, int x) { ... }

并将其命名为

Insert(&head, 25);

那么实际参数是指向变量 head 的指针,如果您在适当的情况下引用该参数,则该函数有机会更新该变量:

// ...
temp->next = *head;
// ...
*head = temp;
// ...

关于c - 如何将空指针(结构返回类型)更改为声明的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57380002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com