gpt4 book ai didi

c - 指针和数组的关系

转载 作者:太空宇宙 更新时间:2023-11-04 00:09:29 24 4
gpt4 key购买 nike

我的问题既特定于我正在处理的作业,也涉及指针和数组之间关系的概念。我正在以指向排序列表的指针数组的形式编写哈希表。我创建了一个结构来定义哈希表的类型,表中的元素数量在宏中定义。由于表的大小是可变的,结构需要包含一个指向表本身的指针——一个指向指针数组的指针。我的问题围绕着这样一个想法,即指向某种数据类型的指针与该数据类型数组的第一个元素的标签相同。

我有一个数据类型 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 指针数组,arrayPtrSortedList***输入我的哈希表结构。我正在使用 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。不幸的是,编译器不同意。我收到此错误:

error: invalid operands to binary == (have ‘struct SortedList’ and ‘void *’)

所以在某处我对这一切的推理是错误的。

最佳答案

您可能需要多读一点关于 C 中的数组和指针的内容,因为我认为您没有完全掌握这个概念。我可能是错的,但我怀疑你需要一个三级指针来实现你想要做的事情;我认为您可能会感到困惑,并认为如果您想指向一个数组的数据,您需要指向实际的数组 (&array),它本质上是一个指针本身。画图也确实有助于形象化内存中发生的事情。

数组只是一个顺序数据 block ,其中 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]


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

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

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

关于c - 指针和数组的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com