作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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/
我是一名优秀的程序员,十分优秀!