在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提问者可以提供一个例子来说明