正确的方法来访问结构指针

时间:2012-10-22 06:00:41

标签: c arrays pointers struct

我有以下代码:

typedef struct AdjMatrix
{
  int nodes;
  int **adjMat;
} graph;

typedef struct Edge
{
  int from,to,weight;
}Edge;


int main(){
  ...

  graph *g=(graph *)malloc(sizeof(graph));
  g-> adjMat = (int **)malloc(sizeof(int *) * vertices);
  for( i = 0; i < vertices; i++){
    g->adjMat[i] = (int *)malloc(sizeof(int) * vertices);
  }
 ...

 Edge *E = (Edge *)malloc(sizeof(Edge) * maxEdges);

 int nEdges = 0;
 for(i = 0; i < g->nodes ; i++){
    for(j= 0; j< g->nodes; j++){
            if(i <= j){
                    printf("%d\t%d\t%d\t\n",i,j,g->adjMat[i][j]);
                    E[nEdges].from = i;
                    E[nEdges].to = j;
                    E[nEdges].weight = g->adjMat[i][j];
                    nEdges++;
            }
            else
                    break;
    }
 }


}

如您所见,我通过“ - &gt;”访问图g的元素边缘E的元素由“。”组成。我不明白为什么如果我通过“。”访问图g的元素,编译器会抛出错误。边缘E的元素是“ - &gt;”?请解释

4 个答案:

答案 0 :(得分:2)

您使用E作为数组,并且该数组中的单独成员不是指针,因此您必须使用点运算符来访问元素。

另一方面,你有g指向单个graph结构的指针,作为指针,你使用->运算符。

但是,您可以将数组E作为指针访问,将变量g作为数组访问。例如,以下两个语句都完全相同:

E[0].from = i;

(E + 0)->from = i;

您可以像这样的数组访问g

g[0].nodes = x;

答案 1 :(得分:1)

g被声明为graph*类型,使其成为指向图形的指针。这意味着您必须使用指针取消引用运算符g访问->的元素。

E也是一个指针,在本例中为Edge*或指向Edge的指针,但您正在使用数组语义。 E[nEdges] 不是指针,这意味着您必须使用.运算符。

基本上,当你使用数组语义时,你会丢失变量的指针。

E的类型为Edge*E[x]的类型为Edge

答案 2 :(得分:0)

在你的代码中,g和e都是指向结构的指针。数组的行为与指针的行为相同,因此e [nEdges]实际上等于位于位置的边(e + 12 * nEdges)。 e [0] .from与e-&gt; from。相同。

答案 3 :(得分:0)

->运算符用于指针取消引用指针,然后应用.运算符。因此,例如,a->b相当于(*a).b

.运算符如前所述访问成员变量。您已注意到gE都是指针,但->运算符无法在E上运行的原因是因为您已经在使用[] 1}} E上的运算符,也可以作为解除引用程序。例如,行E[nEdges].to相当于(*(E + nEdges)).to,而如果您尝试在此实例中使用->运算符,那么它将等同于(*(*(E + nEdges))).to,这也是一个解除引用许多。