当前位置: 首页 > 科技观察

十分钟带你看懂C语言链表

时间:2023-03-21 18:30:30 科技观察

首先,指针计算机里面的一切都是数字。当您在C中创建一个变量时,编译器仅按地址处理它,但在您的代码中,您可以通过两种方式访问??它:按值和按地址。在这段代码中,我使用了三个变量,编译器将通过地址访问所有这些变量。time-全局变量-存储在堆中启动代码分配的内存块。它的创建方式并不重要,但并非所有编译器都相同。这就是我们想要获得的技术。为简单起见,假设变量Times结束于内存位置256(0x100)。变量i在堆栈上的位置是64(0x40)。文本“Hello...”位于位置200(0xc8)。最后,跳过得到68(0x44)。现在假设您这样调用function():这就是for循环的开头:时间-存储在0x100-值10已跳过-存储在0x44-值2i-存储在0x40-值0未命名文本存储在0xc8-值"Helloworld-%d\n现在寻址非常简单。在C世界中,当您使用不是指针的变量名时,编译器会将其视为“存储在地址中的值”。因此,当您使用变量skip,编译器使用“存储在0x44处的值”。这段代码中的所有变量都是“按值”,意味着只使用值。指针是变量的地址。假设我们这样做:现在,你有一个名为TimesPtr的变量。像所有其他变量一样,它有一个与之关联的内存地址。但是通过将其定义为指针,您可以将其值分配给内存地址。因此,使用上述所有数字,我们还将添加TimesPtr-存储在地址260(ox104)-堆栈中的数字-存储在地址263(卷0x108)-在堆上我们已经分配了TimePtr作为Times的地址,即0x100。在循环的开始,我们指定i=0,所以0x40中存储了0。我们还分配了Num,它也是一个指向整数0的指针。编译器将创建代码,将0放入卷0x108,地址编号。当您使用'*'operator时,您是在告诉编译器使用您指定的变量“存储在该地址的值”。仅使用变量名时,您是在告诉编译器“存储的值”。顺便说一句,在printf()调用中,文字的地址被传递给函数printf(),因为文字在编译器中只有地址,没有名称(而数组是按地址传递的,文字是数组字符))。创建链表的最简单方法是简单地将指针作为结构成员添加到结构本身。下面是它是如何完成的:如果你想使用一个typedef,你不能使用typedef名称,因为它还没有被定义。假设我们想引用_student结构作为studentT。代码如下所示:现在,next将是列表中下一个节点的地址,如果没有则为NULL。这是创建链表的最简单方法。只需创建一个节点,将其下一个指针分配给列表地址,然后将列表头分配给该节点的地址。在课堂上,最好处理strdup(),删除节点时记得释放节点。现在,您需要在单个链表中进行插入和删除操作。我会给你一个通用链表来保存任何数据类型: