我知道为了使调用者的内存反映对被调用者的局部参数的更改,您需要将参数作为指针的引用传递。当我直接使用Push(1, &h1); Push(3, &h1); Push(5, &h1);
时,一个正确的列表被创建并打印出来。但是如果我通过createList(&h1);
调用Push(..., &h1)
,编译器给出warning: incompatible pointer types passing 'struct ListNode ***' to parameter of type 'struct ListNode **'; remove & [-Wincompatible-pointer-types]
,并且没有创建列表。在我按照编译器说的去除了& &之后,我仍然没有得到列表。
我的问题:什么是兼容的指针类型,当我传递它作为一个指针的引用到一个函数,通过另一个函数在C?
void Push(int val, struct ListNode **headRef){
struct ListNode *newNode = malloc(sizeof(struct ListNode));
newNode->val = val;
newNode->next = *headRef;
*headRef = newNode;
}
void createList(struct ListNode **head){
int num;
printf("Enter data to create a list. (Enter -1 to end)n");
scanf("%d", &num);
while (num != -1){
Push(num, &head); // Note: the '&'
scanf("%d", &num);
}
}
int main(){
createList(&h1);
printList(h1);
}
void printList(struct ListNode *head){
struct ListNode *curr= head;
while (curr != NULL) {
printf("%d ", curr->val);
curr = curr->next;
}
}
当您在createList
中调用Push
时,您需要传递head
,而不是&head
。
Push
期望ListNode **
。createList
中的head
变量也是ListNode **
类型的,因此在调用Push
时不需要获取其地址或对其解引用。
在createList
中,head
包含h1
的地址。如果将相同的值传递给Push
,则在该函数中headRef
也包含h1
的地址。
我用Push(num, head);
运行了你的代码,它似乎输出了你所期望的。