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