首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言使用链接列表创建实例和数据类型

C语言使用链接列表创建实例和数据类型
EN

Stack Overflow用户
提问于 2020-04-11 00:52:30
回答 1查看 37关注 0票数 0

我正在学习C语言,还有一本书叫“Sams Teach book”。我理解链表的概念,但不能理解技术。我将写下我是如何理解这一点的,并在此过程中提出了一些问题。如果我错了请告诉我,或者你知道问题的答案。我们开始吧。

第1节

首先,我需要定义数据结构并声明head指针来启动如下所示的链接列表。

代码语言:javascript
复制
struct person{
  char name[20];
  struct person *next;
};
struct person *new;
struct person *head;
head = NULL;

在这里,定义了一个简单的结构。它的类型或标记名为person。它有一个元素,一个名为name的数组,以及一个名为next的自引用指针.在结构定义之后,将声明2个指针。其中一个被初始化为NULL,因为它是一个很好的实践,因为没有什么可指出的。

第1节问题

  • 在第1节中,我是否正确地理解了链接列表的初步内容?

第2节

这本书解释说,向列表的开头添加一个新元素的过程是三个步骤。

  1. 创建结构实例,使用malloc()分配内存空间。
  2. 将新元素的下一个指针设置为head指针的当前值。如果列表为空,或者当前第一个元素的地址为空,则此值为空。
  3. 使头指针指向新元素。
代码语言:javascript
复制
    new = (person*)malloc(sizeof(struct person));
    new->next = head;
    head = new

new被分配给malloc,我有一个问题要问。值NULL ofhead被分配给自引用指针,因为它是最后一个指针。然后将new的值分配给指向点的顶部指针head

第二节问题

  • 在这段代码中,在哪里创建一个实例?创建实例的格式不是struct tag instance吗?new是一个实例吗?它不是在第1节中声明的指针吗?
  • sizeof(struct person)是如何工作的?sizeof(char)是1,因为char是1字节.struct person怎么可能有一个值,因为它只是一个标记名?
  • 这本书解释说,malloc()是类型化的,因此它的返回值是正确的类型--指向person数据结构的指针。我认为C中的数据类型只是int, char, float和它们的变体。指针是数据类型吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-11 01:31:29

在这里,定义了一个简单的结构。它的类型或标记名为person。它有一个元素,一个名为name的数组,以及一个名为next的自引用指针.在结构定义之后,将声明2个指针。其中一个被初始化为NULL,因为它是一个很好的实践,因为没有什么可指出的。

全部正确,但100%准确地说,没有“自引用指针”,它只是一个指向同一类型的结构的指针字段,它可以指向该类型的任何其他结构。

在这段代码中,在哪里创建一个实例?用于创建实例的格式结构标记实例不是吗?是新的例子吗?它不是在第1节中声明的指针吗?

“创建一个实例”是错误的措辞。C中没有所谓的“实例”,在C中,内存可以通过两种主要方式分配:自动(通过变量声明)或动态(通过显式调用malloc()或类似函数)。

变量的自动分配发生在堆栈上,并且(顾名思义)是自动的:您不需要担心显式地为变量保留空间,编译器会为您提供空间,并且当变量超出作用域时,它也会释放出该空间。动态分配由用户手动执行,因此也需要使用free()进行手动清理,以便在不再需要时释放所分配的空间。

在这种情况下,由于您声明了一个指针struct person *new,所以您已经为指针本身自动分配了空间,但是如果您希望该指针指向有效的东西,则仍然需要为该struct分配空间。

sizeof(struct person)是如何工作的?

每种类型都有一个已知的固定大小(几乎,也有例外)。由多个基本类型组成的结构具有至少是其字段大小之和的大小。您的struct person是一个由您定义的新类型,它有自己的大小,它不仅仅是一个“标记名”。每次创建struct person类型的变量时,程序都需要为其分配sizeof(struct person)字节。特别是:

代码语言:javascript
复制
sizeof(struct person) >= 20 * sizeof(char) + sizeof(struct person *);
//                            ^^^ always 1   ^^^ usually 4 (on a 32bit system) or 8 (on a 64bit system)

这本书解释说,malloc()是类型化的,因此它的返回值是正确的类型--指向person数据结构的指针。

这本书错了。您做的是,而不是,需要转换malloc()的结果。在C中,有一个特殊类型:void:它的意思是"no type“。关联的指针类型void *意味着“指向任何类型的指针”,也是malloc()返回的内容。

void *类型的指针始终可以转换到任何其他指针类型,从/到void *到/从任何其他指针类型的转换会自动进行,而不需要显式的转换。也请看这里有一个很好的解释为什么要转换malloc()的返回值是个坏主意。

我认为C中的数据类型只是int, char, float & variation of them。指针是数据类型吗?

哦,不,不只是那些。您刚刚自己定义了一个新的数据类型(struct person)。我很惊讶你的书没有定义数据类型是什么,然后再深入到更高层次的东西,如链接列表和动态内存分配。指针实际上是C中的另一种基本数据类型,因为您可以获取任何类型变量的地址,所以指针数据类型与非指针数据类型一样多:int *char *float *、ecc。实际上,struct person *是一个指针数据类型,它标识指向struct person类型变量的指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61150773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档