链表代码C中的结构与动态分配结构

时间:2018-07-23 03:19:47

标签: c memory struct dynamic-memory-allocation

我有一个完整的链接列表代码,可以反转字符串的内容。我的问题是试图了解“&”运算符和“ *”运算符的含义。以及它对代码的意义。

这是主要代码;

#include "strlst.h"
#include <stdlib.h>
#include <stdio.h>

int main()
{
char letter;
char *string = "dlrow olleh\n";
struct strlst_struct *item_ptr, *list_ptr;

list_ptr = NULL;

for (;*string;string++)
{
    item_ptr = new_item( *string );
    push( &list_ptr, item_ptr );
}

while (list_ptr)
{
    item_ptr = pop( &list_ptr );
    letter = free_item( item_ptr );
    printf( "%c", letter );
}
printf( "\n" );

return 0;
}

如您所见,list_ptr在函数中使用“&”运算符调用,而item_ptr则不是。我想知道为什么会这样,有什么区别。

我将发布第一个循环所需的功能。第一个函数对我来说很容易理解,似乎我们只是将字符“ d”设置为item_ptr中的数据,然后将指针设置为NULL。

第二个功能让我感到困惑。我不知道'*'是怎么回事,它对程序有什么影响。

第一个功能:

struct strlst_struct *new_item( char character )
{
struct strlst_struct *item_ptr;

item_ptr = malloc( sizeof(struct strlst_struct) );
item_ptr->character = character;
(*item_ptr).next = NULL;

return item_ptr;
}

第二功能:

void push( struct strlst_struct **list_ptr, 
       struct strlst_struct *item_ptr )
/* Add the item pointed to by item_ptr to the beginning of the list 
   pointed to by list_ptr.
*/
{
item_ptr->next = *list_ptr;
*list_ptr = item_ptr;
}

即使您不理解我提供的上下文,仅了解何时以及为什么在动态分配的结构中使用“ *”和“&”也是我不了解的事情。

Ps。 strlst_struct的定义是:

struct strlst_struct
{
char character;
struct strlst_struct *next;
};

1 个答案:

答案 0 :(得分:0)

void push( struct strlst_struct **list_ptr, struct strlst_struct *item_ptr ) 您可以在此处看到item_ptr attribute只是一个简单的指针,其中包含strlst_struct结构的常规元素的地址。
另一方面,list_ptr attribute是双指针。这意味着它包含简单或常规指针的地址,而后者又包含常规变量的地址。

从您的声明中:

struct strlst_struct *item_ptr, *list_ptr;

两个指针都不是双指针(它们不保存另一个指针的地址,只是一个常规元素)。当您将这些传递到此处的push()函数时:

push( &list_ptr, item_ptr );  

您必须确保将双精度指针作为第一个参数,将普通指针作为第二个参数。 因此,&list_ptr是必需的:它存储指针的地址。

来到运营商:
&运算符为您提供变量的地址。通用指针初始化涉及到此:

int x = 5;
int *ptr_to_x;

ptr_to_x = &x;

*运算符在一元运算符中使用时是递归运算符。它允许人们访问存储在给定地址中的值。
回到上面的例子,
打印*ptr_to_x的值将得到5,即x的值。存储在x地址(由ptr_to_x表示)中的值为5。

请通过一些教程或练习问题来加强这个非常重要的概念。