C 指针和数组之间的关系

C 指针和数组之间的关系,c,C,我的问题既针对我正在做的作业,也针对指针和数组之间的关系。我正在以指向已排序列表的指针数组的形式编写一个哈希表。我创建了一个结构来定义哈希表的类型,表中的元素数量在宏中定义。由于表的大小是可变的,因此结构需要包含一个指向表本身的指针—一个指向指针数组的指针。我的问题是,指向某个数据类型的指针与该数据类型数组的第一个元素的标签相同 我有一个数据类型SortedList。据我所知,SortedList*可以解释为指向单个SortedList的指针,或者是指向SortedList数组的第一个元素的指针

我的问题既针对我正在做的作业,也针对指针和数组之间的关系。我正在以指向已排序列表的指针数组的形式编写一个哈希表。我创建了一个结构来定义哈希表的类型,表中的元素数量在宏中定义。由于表的大小是可变的,因此结构需要包含一个指向表本身的指针—一个指向指针数组的指针。我的问题是,指向某个数据类型的指针与该数据类型数组的第一个元素的标签相同

我有一个数据类型
SortedList
。据我所知,
SortedList*
可以解释为指向单个SortedList的指针,或者是指向
SortedList
数组的第一个元素的指针。在此基础上扩展,
SortedList**
可以是一个
SortedList
指针数组,
SortedList***
可以是指向该数组的指针。这就是我的哈希表结构中的内容。我的第一个问题是,我对这一点的理解是否正确

在创建哈希表的函数中,我有:

SortedList** array;

if ((array = calloc(size,sizeof(SortedList*))) == NULL) {
    // error allocating memory
    printf("Memory Error\n");
    return NULL;
}

table->arrayPtr = &array;
因此,
array
是我的
SortedList
指针数组,
arrayptor
是我的哈希表结构中的
SortedList***
类型。我正在使用
calloc
,因为我认为它将初始化所有指向
NULL
的指针。如果我弄错了,请告诉我。据我所知,到目前为止,所有这些编译都没有错误 太好了

我有一个函数,它将数据插入表中,首先检查指针是否已被使用,检查指针是否指向
NULL
,如果没有,它将创建一个
SortedList
,供指针指向

int i = index->hashFunc(word);
SortedList*** table = index->arrayPtr;

if (*(table +i) == NULL){
    return 0;
}
因此,在我看来,取消引用
(table+i)
应该给我一个SortedList**——SortedList指针数组中的第i个元素——然后我可以检查它是否设置为
NULL
。不幸的是,编译器不同意。我得到这个错误:

错误:二进制==(具有“struct SortedList”和“void*”的操作数无效)


因此,在某种程度上,我对这一切的推理是错误的。

您可能需要阅读更多关于C中数组和指针的内容,因为我认为您还没有完全理解这个概念。我可能错了,但我怀疑你是否需要一个三级的指针来实现你想要做的事情;我认为您可能会感到困惑,认为如果要指向数组的数据,您需要指向实际的数组(&array),它本质上就是一个指针本身。画一幅画也能真正帮助想象记忆中发生的事情

数组仅仅是一个序列数据块,其中C中的变量名(没有任何[],它将从数组中获取一个元素)指向数组中的第一个元素。下面示例中的两行是等效的(其中array显然是一个数组):

然后,您可以使用p_array与使用array的方式完全相同,即


有些人在学习时可能会做的不必要的事情是使用指向数组的指针(我认为这就是您正在做的):

然后要访问数组的元素,它们必须取消对指针的引用,然后使用数组表示法指定数组中的元素:

*p_p_array[3] == array[3]

我们在这里实际做的是存储数组的内存地址(它本身是指向第一个元素的指针),然后我们必须取消引用才能到达第一个元素,然后我们向前移动3个位置才能到达第四个元素(数组[3])

在第一个示例中,它更简单、更符合逻辑,因为我们存储了一个指向数组中第一个元素的指针,并且让指针以与初始数组变量相同的方式工作


我建议你在一张纸/白板上画出你想做的事情,看看你做错了什么,然后就可以清楚地知道如何正确地实施它。当我编写代码时,我的白板是我最好的工具之一。

请阅读第6节。Keith和J.F.的链接对它的解释比我能做的要好得多;知道指针和数组之间的区别很重要。感谢您的详细回复。我想我现在终于让它工作了。我用了一个,太多了。
p_array[3] == array[3]
int **p_p_array = &array;
*p_p_array[3] == array[3]