当我将它作为指向通过 C 中另一个函数的函数的指针的引用传递时,兼容的指针类型是什么?

What is the compatible pointer type when I pass it as a reference of a pointer to a function that goes through another function in C?

我知道为了让调用者的内存反映被调用者局部参数的变化,需要将参数作为指针的引用传递。当我直接使用 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); 它似乎输出了你所期望的。