我有一个数组结构,该结构应该包含指向另一个结构的指针。我的结构是这样的:
struct Term{
char* term;
int times;
};
typedef struct Term TERM;
struct HeapTer{
TERM* Term;
size_t used;
size_t size;
};
typedef struct HeapTer HEAPTER;
struct Pack{
HEAPCON* hCon;
HEAPTER* hTer;
};
typedef struct Pack PACK;
Pack只会保存我将从结构加载函数返回的两个数组的指针。
我的问题是何时调用函数,在其中将给定术语插入到咨询术语堆中。
InsertHeapTer(pack->hTer->Term[ind_term],consult->hTer)
其中InsertHeapTer
被定义为InsertHeapTer(TERM* Ter, HEAPTER *t)
。
编译器给我以下错误,error: incompatible types when assigning to type 'TERM {aka struct Term}' from type 'TERM * {aka struct Term *}'
。
所以,这就是说,当我使用pack->hTer->Term[ind_term]
时,即使它在结构中被定义为指针,它也会给我TERM
而不是TERM*
。
我在做什么错,为什么会这样?
编辑: 复制代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Termo{
char* termo;
int vezes;
};
typedef struct Termo TERMO;
struct HeapTer{
TERMO* Termo;
size_t usado;
size_t tam;
};
typedef struct HeapTer HEAPTER;
struct consulta{
char *Local;
HEAPTER *hTer;
};
typedef struct consulta CONSULTA;
struct HeapCon{
CONSULTA* con;
size_t usado;
size_t tam;
};
typedef struct HeapCon HEAPCON;
struct Pacote{
HEAPCON* hCon;
HEAPTER* hTer;
};
typedef struct Pacote PACOTE;
void InsereHeapTer(TERMO* Ter, HEAPTER *t){
}
int main(){
PACOTE* pack;
CONSULTA* consulta;
int ind_termo=1;
InsereHeapTer(pack->hTer->Termo[ind_termo],consulta->hTer);
return 0;
}
void InsereHeapTer(TERMO* Ter, HEAPTER *t){
}
对不起,但这是我能做的最小设置。
答案 0 :(得分:3)
因此,这就是说,当我使用
pack->hTer->Term[ind_term]
时, 我是TERM
而不是TERM*
,
是的
即使它被定义为 结构。
请注意:即使什么被定义为指针?如此定义的是pack->hTer->Term
。在这种情况下,pack->hTer->Term[ind_term]
确实具有类型TERM
。它等效于*(pack->hTer->Term + ind_term)
。
这建议一种解决方案:如果您打算将指针传递给该项目而不是该项目的副本,则可以使用指针算术将所需的指针生成为pack->hTer->Term + ind_term
。我倾向于这样的简单性,但从风格上讲,我确定有些人会喜欢等效的表达式&pack->hTer->Term[ind_term]
。
答案 1 :(得分:1)
要简化有问题的代码行,您可以执行以下操作:
TERMO* termo = pack->hTer->Termo;
InsereHeapTer(termo[ind_termo],consulta->hTer);
很显然,termo
是TERMO*
。 []
运算符的定义如下:
下标运算符
[]
的定义是E1[E2]
与(*((E1)+(E2)))
相同。
C.11§6.5.2.1¶2
因此,您的函数调用等效于:
InsereHeapTer(*(termo + ind_termo),consulta->hTer);
这可以再次简化:
TERMO* termo_plus_ind = termo + ind_termo;
InsereHeapTer(*termo_plus_ind,consulta->hTer);
取消引用TERMO*
时会得到TERMO
。