我遇到了C语言中的一个代码,其中似乎有多个指针分配(以块引用)。这是如何运作的?甚至没有定义“上一个”。
此处提供代码:
// A complete working C program to demonstrate deletion in singly
// linked list
#include <stdio.h>
#include <stdlib.h>
// A linked list node
struct Node
{
int data;
struct Node *next;
};
/* Given a reference (pointer to pointer) to the head of a list
and an int, inserts a new node on the front of the list. */
void push(struct Node** head_ref, int new_data)
{
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
/* Given a reference (pointer to pointer) to the head of a list
and a key, deletes the first occurrence of key in linked list */
void deleteNode(struct Node **head_ref, int key)
{
// Store head node
struct Node* temp = *head_ref, *prev;
// If head node itself holds the key to be deleted
if (temp != NULL && temp->data == key)
{
*head_ref = temp->next; // Changed head
free(temp); // free old head
return;
}
// Search for the key to be deleted, keep track of the
// previous node as we need to change 'prev->next'
while (temp != NULL && temp->data != key)
{
prev = temp;
temp = temp->next;
}
// If key was not present in linked list
if (temp == NULL) return;
// Unlink the node from linked list
prev->next = temp->next;
free(temp); // Free memory
}
// This function prints contents of linked list starting from
// the given node
void printList(struct Node *node)
{
while (node != NULL)
{
printf(" %d ", node->data);
node = node->next;
}
}
/* Drier program to test above functions*/
int main()
{
/* Start with the empty list */
struct Node* head = NULL;
push(&head, 7);
push(&head, 1);
push(&head, 3);
push(&head, 2);
puts("Created Linked List: ");
printList(head);
deleteNode(&head, 1);
puts("\nLinked List after Deletion of 1: ");
printList(head);
return 0;
}
答案 0 :(得分:4)
定义
struct Node* temp = *head_ref, *prev;
与
相同struct Node* temp = *head_ref;
struct Node *prev;
这是一些非常基本的语法,即使是非常糟糕的教程或书籍也应该显示出来。
答案 1 :(得分:1)
这是对Node临时任务的研究,并将其初始化为head_ref。它正在声明另一个名为prev的节点,而不是将其初始化为任何内容
答案 2 :(得分:1)
结构节点* temp = * head_ref,*上一个 您声明2个指向Node的指针,一个是temp,第二个是prev,为temp分配一个值,即head_ref deref,完全合法。
答案 3 :(得分:1)
变量*prev
未分配,正在定义中。您可以在C中有这样的定义:
int a, b; // two integers
struct Node *a, b; // a pointer to a struct and a struct itself
定义唯一要做的就是为*temp
变量赋值。
答案 4 :(得分:0)
这不是多重分配(C不支持)-这是两个对象的声明,其中一个具有初始化程序。
这比您想要的要详细得多,但是我不想从事我本应从事的工作,并且需要分神。
在C中声明对象或函数的顶级语法如下:
declaration:
declaration-specifiers init-declarator-listopt ;
declaration-specifiers
包括类型说明符(int
,float
,double
,struct xxx
等),类型限定符(const
,volatile
)和存储类说明符(static
,register
,auto
,typedef
)
init-declarator-listopt
是声明符的可选列表,每个声明符都有一个可选的初始化程序。 declarator 引入要声明的事物的名称,以及其数组形式,指针形式和/或功能形式。
因此,当我们查看声明时:
struct Node* temp = *head_ref, *prev;
struct Node
是declaration-specifiers
的一部分,而*temp = *head_ref
和*prev
组成init-declarator-list
(在声明中,*
运算符总是绑定到声明符,而不是类型说明符-上面的内容解析为struct Node (*temp) = (*head_ref), (*prev)
。