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

时间:2018-06-29 17:24:52

标签: 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;
    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){
}

对不起,但这是我能做的最小设置。

2 个答案:

答案 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);

很显然,termoTERMO*[]运算符的定义如下:

  

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