[...] 当我需要访问结构的属性时,我创建
一个指向如下结构的指针。
struct node *node1;
node1 -> data = 12;
node1 -> next = NULL;
不完全是。您已将node1 声明为struct node * 类型的变量,但您没有 创建了一个指针,因为您没有为该变量指定一个指向任何结构的值。随后尝试通过该变量的(不确定的)值访问 struct node 因此会产生未定义的行为。更有可能的结果是您的程序崩溃或对其内存中的随机对象进行了意外更改。
为了能够使用node1 访问您所展示的struct node,您首先需要将其分配为指向一个(或至少指向可以包含一个的内存)。您可以通过将现有struct node 的地址分配给它,或者为struct node 分配足够的内存并将其地址分配给node1 来做到这一点。稍后将详细介绍这些替代方案。
我想知道我们是否可以使用
struct node node1
而不是当前的声明以及这会带来哪些变化
程序。
您绝对可以将node1 声明为struct node 而不是指向一个的指针。在此类声明的范围内,您将通过直接成员访问运算符 (.) 访问其成员,而不是通过间接成员访问运算符 (->):
node1.data = 12;
node1.next = NULL;
此外,获取指向struct node 的指针的方法之一是使用地址运算符 (&) 来获取该结构的地址:
struct node *node_ptr = &node1;
但是,以这种方式声明的 node1 对象的生命周期在控制权从出现声明的最内层块(如果有)中结束时结束,尽管有任何指向它的指针。因此,这通常不是您想要的链表节点。
对于链表应用程序(以及其他应用程序),通常需要一个对象,其生命周期在您说它应该结束之前不会结束,这可以通过为结构动态分配内存来实现。例如,
struct node *node_ptr = malloc(sizeof(*node_ptr));
分配的内存保持分配状态,直到您明确地free() 它,无论是在该范围内还是在另一个范围内。无论哪种方式,要通过有效指针访问结构成员,都可以使用间接访问运算符,如您的示例所示:
node_ptr->data = 42;
node_ptr->next = NULL;
或者,等效地,首先取消引用指针,然后使用直接成员访问运算符:
(*node_ptr).data = 42;
(*node_ptr).next = NULL;
.
另外,我想知道为什么 *START=NULL 在结构之外以及什么
它的数据类型是?
你说你编写了代码。如果您不知道*START=NULL 部分的意义,那么它在您的代码中做了什么?
无论如何,它类似于上面的*node_ptr = &node1。 START 被声明(在文件范围内)为指向 struct node 的指针,并且其初始(指针)值被分配为 NULL,它明确且可测试地不指向任何结构。