具有数据结构的双指针的算术

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)),使用所有字段大小的总和。如果我们要在不使用指针的情况下确定递归结构的大小(对于任何类型的数据,指针具有固定大小),那么该结构将具有无限大小。为了避免这个问题,我们因此使用了一个指针。

【讨论】:

以上是关于具有数据结构的双指针的算术的主要内容,如果未能解决你的问题,请参考以下文章

c中结构指针内的双数组

SWIG Python - 包装一个需要指向结构的双指针的函数

C++指针的算术运算 关系运算

结构上的指针算术

Dijkstra的双栈算术表达式求值算法

Dijkstra的双栈算术表达式求值算法