具有数据结构的双指针的算术
Posted
技术标签:
【中文标题】具有数据结构的双指针的算术【英文标题】:Arithmetic of the double pointers with a data structure 【发布时间】:2020-08-19 19:38:27 【问题描述】:我尝试编写哈希表并找到了这个 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;
我有两个问题:
为什么使用
typedef struct entry_s entry_t;
而不是
struct entry_s
char* key;
char* value;
struct entry_s* next;
entry_t;
因为如果我使用第二种方式,我会出错。
该代码是什么意思:
struct entry_s** table;
我知道这个问题很容易回答,但如果你能帮助我,我会很高兴
【问题讨论】:
你应该更好地阅读编译器给出的错误信息,以及更多地了解你正在使用的数据结构类型,有很多资源详细介绍了X的逐步实现。 【参考方案1】:第二个问题的答案是,您正在标记一个指针数组,该数组可以存储 struct entry_s**
类型的指针。
【讨论】:
【参考方案2】:为什么使用
typedef struct entry_s entry_t;
而不是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
字段中看到一个指针的原因.然后,为了区分结构的“内部”使用和外部使用,我们定义了一个别名类型:
typedef struct my_linked_list_s my_linked_list_t;
或者,在你的情况下:
typedef struct entry_s entry_t;
虽然这不是必需的,但您的实现已选择这样做。您可以看到命名约定:_s
表示“结构”,_t
表示“类型”。
因为如果我使用第二种方式,我会出错。
您应该更仔细地阅读编译器的错误消息,它会帮助您了解问题所在。
该代码是什么意思:
struct entry_s** table;
这是一个指针数组。您的实现选择使用链表和指针,this function 清楚地描述了添加部分。
如需更好地了解 C 哈希表,请查看this answer。
*要确定结构的大小 (sizeof(struct my_struct)
),使用所有字段大小的总和。如果我们要在不使用指针的情况下确定递归结构的大小(对于任何类型的数据,指针具有固定大小),那么该结构将具有无限大小。为了避免这个问题,我们因此使用了一个指针。
【讨论】:
以上是关于具有数据结构的双指针的算术的主要内容,如果未能解决你的问题,请参考以下文章