指针和数组之间的关系

时间:2011-10-22 06:27:25

标签: c

我的问题既针对我正在进行的任务,也针对指针和数组之间关系的概念。我正在以排序列表的指针数组的形式编写哈希表。我已经创建了一个结构来定义哈希表的类型,并且表中的元素数量是在宏中定义的。由于表的大小是可变的,因此struct需要包含指向表本身的指针 - 指向指针数组的指针。我的问题围绕着这样一种观点,即指向某种数据类型的指针与该数据类型的数组的第一个元素的标签相同。

我的数据类型为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指针数组,arrayPtr是我的哈希表结构中的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 *')

所以在某个地方,我对这一切的推理是错误的。

1 个答案:

答案 0 :(得分:0)

您可能需要在C中读取更多关于数组和指针的内容,因为我认为您并不完全掌握这个概念。我可能错了,但我怀疑你需要一个三级指针来实现你想要做的事情;我想你可能会让自己感到困惑,并认为如果你想指向一个数组的数据,你需要指向实际的数组(&数组),它实际上是一个指针本身。绘制图片也可以真正帮助可视化内存中发生的事情。

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

int *p_array;
p_array = array;     /* equivalent */
p_array = &array[0]; /* equivalent */

然后您可以像使用 array 一样使用p_array 完全,即。

p_array[3] == array[3]


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

int **p_p_array = &array;

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

*p_p_array[3] == array[3]


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

在第一个例子中,它更简单,更逻辑,因为我们存储一个指向数组中第一个元素的指针,并且指针的作用方式与我们的初始数组变量相同

我建议你在一张纸/白板上画出你想要做的事情,看看你做错了什么,然后可能会以正确的方式正确地实现它。当我编写代码时,我的白板是我最好的工具之一。

相关问题