在C中访问时取消引用的指针数组

在C中访问时取消引用的指针数组,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,我有一个数组结构,它应该包含指向另一个结构的指针。我的结构是这样的: 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; HEA

我有一个数组结构,它应该包含指向另一个结构的指针。我的结构是这样的:

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将只保存我将从结构加载函数返回的两个数组的指针

我的问题是何时调用一个函数,在这里我将向consults term堆插入一个给定的项

InsertHeapTer(pack->hTer->Term[ind_term],consult->hTer)
其中,
InsertHeapTer
定义为
InsertHeapTer(TERM*Ter,HEAPTER*t)
。 编译器给出了以下错误,
错误:从类型“TERM*{aka struct TERM*}”指定给类型“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){
}
#包括
#包括
#包括
结构术语{
char*termo;
内忧外患;
};
类型定义结构Termo Termo;
结构HeapTer{
TERMO*TERMO;
尺寸(美国);;
尺寸(t tam);;
};
类型定义结构HeapTer HeapTer;
结构顾问{
char*本地;
HEAPTER*hTer;
};
类型定义结构协商;
结构HeapCon{
领事馆*con;
尺寸(美国);;
尺寸(t tam);;
};
类型定义结构HeapCon HeapCon;
结构填料{
HEAPCON*hCon;
HEAPTER*hTer;
};
类型定义结构Pacote Pacote;
无效插入式升降机(TERMO*TERM,HEAPTER*t){
}
int main(){
PACOTE*包装;
领事馆*领事馆;
int ind_termo=1;
内墙(包->hTer->Termo[ind_Termo],领事->hTer);
返回0;
}
无效插入式升降机(TERMO*TERM,HEAPTER*t){
}
对不起,这是我能做的最小设置

所以,这是说,当我使用
pack->hTer->Term[ind_Term]
时 我是一个
术语
而不是
术语*

即使它在中定义为指针 结构

小心:即使什么定义为指针?就是这样定义的
pack->hTer->Term
。在这种情况下,
pack->hTer->Term[ind\u Term]
确实有类型
Term
。它相当于
*(pack->hTer->Term+ind\u Term)

这就提出了一个解决方案:如果你想传递一个指向该项目的指针,而不是该项目的副本,那么你可以使用指针算法生成想要的指针,如
pack->hTer->Term+ind\u Term
。我倾向于简单,但从风格上来说,我相信有些人会喜欢等价的表达方式
&pack->hTer->Term[ind_Term]

所以,这是说,当我使用
pack->hTer->Term[ind_Term]
时 我是一个
术语
而不是
术语*

即使它在中定义为指针 结构

小心:即使什么定义为指针?就是这样定义的
pack->hTer->Term
。在这种情况下,
pack->hTer->Term[ind\u Term]
确实有类型
Term
。它相当于
*(pack->hTer->Term+ind\u Term)


这就提出了一个解决方案:如果你想传递一个指向该项目的指针,而不是该项目的副本,那么你可以使用指针算法生成想要的指针,如
pack->hTer->Term+ind\u Term
。我倾向于简单化,但在风格上,我相信有些人会更喜欢等价的表达方式
&pack->hTer->Term[ind_Term]

要简化有问题的代码行,您可以:

TERMO* termo = pack->hTer->Termo;
InsereHeapTer(termo[ind_termo],consulta->hTer);
显然,
termo
是一个
termo*
[]
运算符的定义如下:

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;
下标运算符
[]
的定义是
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

来简化有问题的代码行,您可以执行以下操作:

TERMO* termo = pack->hTer->Termo;
InsereHeapTer(termo[ind_termo],consulta->hTer);
显然,
termo
是一个
termo*
[]
运算符的定义如下:

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;
下标运算符
[]
的定义是
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

您能否提供一个最小的程序来重现您所面临的问题?什么是
TERMO
?它只是
术语
的打字错误,还是另一种类型?这个特定的类型恰好是问题的核心。@JohnBollinger这是一个打字错误,我修正了它。@jxh我在那里添加了consult定义,通过这个定义,您可以轻松生成一些代码来重现它。如果需要,我可以提供一个链接来下载我的完整测试项目(有点不同,但完整)。@RafaelKehl提问者可以提供一个例子来说明问题。如果我们可以很容易地生成代码来复制它,那么您应该可以很容易地提供它,因为它是为了您的利益。我们需要跨越的障碍越少,你就越有可能得到帮助。你能提供一个再现你所面临问题的最小程序吗?什么是
TERMO
?它只是
术语
的打字错误,还是另一种类型?这个特定的类型恰好是问题的核心。@JohnBollinger这是一个打字错误,我修正了它。@jxh我在那里添加了consult定义,通过这个定义,您可以轻松生成一些代码来重现它。如果需要,我可以提供一个链接来下载我的完整测试项目(有点不同,但很完整)。@RafaelKehl提问者可以提供一个例子来说明