具有数据结构的双指针运算
Arithmetic of the double pointers with a data structure
我尝试编写哈希表并找到了这个 github 存储库:enter link description here。我很难理解这段代码:
struct entry_s
{
char* key;
char* value;
struct entry_s* next;
};
typedef struct entry_s entry_t;
struct hashtable_s
{
int size;
struct entry_s** table;
};
typedef struct hashtable_s hashtable_t;
我有两个问题:
- Why there using the
typedef struct entry_s entry_t;
instead of
struct entry_s
{
char* key;
char* value;
struct entry_s* next;
}entry_t;
因为如果我使用第二种方式,我会出错。
- What does that code mean:
struct entry_s** table;
我知道这个问题很容易回答,但如果你能帮助我,我会很高兴
Why there using typedef struct entry_s entry_t;
instead of
struct entry_s
{
char* key;
char* value;
struct entry_s* next;
};entry_t;
您提供的语法不正确,与您的想法不符。最后一行 };entry_t;
被视为一个新语句,因为您的编译器希望在每个 ;
之后都会有一个新语句。你要写的是下面的代码:
struct entry_s
{
char* key;
char* value;
struct entry_s* next;
} entry_t;
这个结构是一个链表,可以看到其中一个字段(最后一个)使用相同的结构来保存一个数据。更抽象一点,可以看到这样的代码如:
struct my_linked_list_s
{
T data;
struct my_linked_list_s *next;
};
在 C 中,递归数据类型(即在其自己的定义中使用的数据类型)需要一个指针(出于测量结构大小的原因*),这就是为什么我们在 next
字段。然后,为了区分结构体的"internal"使用和外部使用,我们定义一个别名类型:
typedef struct my_linked_list_s my_linked_list_t;
或者,在您的情况下:
typedef struct entry_s entry_t;
尽管这不是必需的,但您的实施已选择这样做。您可以看到命名约定:_s
代表 "structure" 和 _t
代表 "type".
Because if i use second way i will have error.
您应该更仔细地阅读编译器的错误消息,它会帮助您了解问题所在。
What does that code mean: struct entry_s** table;
这是一个指针数组。您的实现选择了使用链表和指针,this function清楚地描述了添加部分。
要更好地了解 C 哈希表,请查看 。
*要确定结构的大小 (sizeof(struct my_struct)
),使用所有字段大小的总和。如果我们要在不使用指针的情况下确定递归结构的大小(指针对于任何类型的数据都有固定大小),那么该结构将具有无限大。为了避免这个问题,我们因此使用指针。
第二个问题的答案是您正在声明一个指针数组,该数组可以存储 struct entry_s**
类型的指针。
我尝试编写哈希表并找到了这个 github 存储库:enter link description here。我很难理解这段代码:
struct entry_s
{
char* key;
char* value;
struct entry_s* next;
};
typedef struct entry_s entry_t;
struct hashtable_s
{
int size;
struct entry_s** table;
};
typedef struct hashtable_s hashtable_t;
我有两个问题:
- Why there using the
typedef struct entry_s entry_t;
instead of
struct entry_s
{
char* key;
char* value;
struct entry_s* next;
}entry_t;
因为如果我使用第二种方式,我会出错。
- What does that code mean:
struct entry_s** table;
我知道这个问题很容易回答,但如果你能帮助我,我会很高兴
Why there using
typedef struct entry_s entry_t;
instead ofstruct entry_s { char* key; char* value; struct entry_s* next; };entry_t;
您提供的语法不正确,与您的想法不符。最后一行 };entry_t;
被视为一个新语句,因为您的编译器希望在每个 ;
之后都会有一个新语句。你要写的是下面的代码:
struct entry_s
{
char* key;
char* value;
struct entry_s* next;
} entry_t;
这个结构是一个链表,可以看到其中一个字段(最后一个)使用相同的结构来保存一个数据。更抽象一点,可以看到这样的代码如:
struct my_linked_list_s
{
T data;
struct my_linked_list_s *next;
};
在 C 中,递归数据类型(即在其自己的定义中使用的数据类型)需要一个指针(出于测量结构大小的原因*),这就是为什么我们在 next
字段。然后,为了区分结构体的"internal"使用和外部使用,我们定义一个别名类型:
typedef struct my_linked_list_s my_linked_list_t;
或者,在您的情况下:
typedef struct entry_s entry_t;
尽管这不是必需的,但您的实施已选择这样做。您可以看到命名约定:_s
代表 "structure" 和 _t
代表 "type".
Because if i use second way i will have error.
您应该更仔细地阅读编译器的错误消息,它会帮助您了解问题所在。
What does that code mean:
struct entry_s** table;
这是一个指针数组。您的实现选择了使用链表和指针,this function清楚地描述了添加部分。
要更好地了解 C 哈希表,请查看
*要确定结构的大小 (sizeof(struct my_struct)
),使用所有字段大小的总和。如果我们要在不使用指针的情况下确定递归结构的大小(指针对于任何类型的数据都有固定大小),那么该结构将具有无限大。为了避免这个问题,我们因此使用指针。
第二个问题的答案是您正在声明一个指针数组,该数组可以存储 struct entry_s**
类型的指针。