我正在学习C语言,还有一本书叫“Sams Teach book”。我理解链表的概念,但不能理解技术。我将写下我是如何理解这一点的,并在此过程中提出了一些问题。如果我错了请告诉我,或者你知道问题的答案。我们开始吧。
第1节
首先,我需要定义数据结构并声明head指针来启动如下所示的链接列表。
struct person{
char name[20];
struct person *next;
};
struct person *new;
struct person *head;
head = NULL;在这里,定义了一个简单的结构。它的类型或标记名为person。它有一个元素,一个名为name的数组,以及一个名为next的自引用指针.在结构定义之后,将声明2个指针。其中一个被初始化为NULL,因为它是一个很好的实践,因为没有什么可指出的。
第1节问题
第2节
这本书解释说,向列表的开头添加一个新元素的过程是三个步骤。
new = (person*)malloc(sizeof(struct person));
new->next = head;
head = newnew被分配给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和它们的变体。指针是数据类型吗?发布于 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)字节。特别是:
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类型变量的指针。
https://stackoverflow.com/questions/61150773
复制相似问题