0

我有以下代码:

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;
    }
 }


}

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

4

4 回答 4

2

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

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

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

E[0].from = i;

(E + 0)->from = i;

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

g[0].nodes = x;
于 2012-10-22T06:06:44.613 回答
1

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

E也是一个指针,在这种情况下是Edge*指向 Edge 的指针,但您使用的是数组语义。E[nEdges]不是指针,意味着您必须使用.运算符。

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

E是类型Edge*E[x]是类型Edge

于 2012-10-22T06:07:00.007 回答
0

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

于 2012-10-22T06:08:10.720 回答
0

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

如您所说,.运算符访问成员变量。您已经注意到gandE都是指针,但是->运算符不起作用的原因E是因为当您已经在使用[]运算符 on 时E,它也充当解引用器。例如,该行E[nEdges].to等效于(*(E + nEdges)).towhile 如果您尝试->在这种情况下使用运算符,它将等效于(*(*(E + nEdges))).towhich would be an dereference too many。

于 2012-10-22T06:10:19.423 回答