什么是兼容的指针类型,当我传递它作为一个指针的引用到一个函数,在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);运行了你的代码,它似乎输出了你所期望的。

相关内容

  • 没有找到相关文章

最新更新