我有一个完整的链接列表代码,可以反转字符串的内容。我的问题是试图了解“&”运算符和“ *”运算符的含义。以及它对代码的意义。
这是主要代码;
#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;
};
答案 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。
请通过一些教程或练习问题来加强这个非常重要的概念。