2012-10-22 40 views
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中的元素 - 和邊E的元素「>」,「」。我不明白爲什麼編譯器會拋出一個錯誤,如果我通過「。」訪問圖g的元素。或通過「 - >」邊緣E的元素?請解釋

回答

2

您使用E作爲數組,而數組中的獨立成員不是指針,所以你必須使用點運算符來訪問元素。

另一方面,您有g這是一個指向單個結構的指針,並且您使用->運算符作爲指針。

但是,您可以將數組E指定爲指針,將變量g作爲數組訪問。例如,下面的兩個語句都如出一轍:

E[0].from = i; 

(E + 0)->from = i; 

,您可以訪問g像這樣的數組:

g[0].nodes = x; 
+0

非常感謝大家的解釋。我現在完全清楚發生了什麼:) – user1439690

1

g被聲明爲graph*類型,使其成爲一個指針到圖形。這意味着您必須使用指針解引用運算符:->來訪問g的元素。

E也是一個指針,在這種情況下Edge*或指針指向邊緣,但是你正在使用它的數組語義。 E[nEdges]而不是指針,這意味着您必須使用.運算符。

基本上,當使用陣列語義就失去了變量的指針的煩躁。

E類型Edge*E[x]Edge類型。

0

在代碼中,g和e爲指針結構。數組的行爲與指針相同,所以e [nEdges]實際上等於位於位置(e + 12 * nEdges)的邊。 e [0] .from將與e-> from相同。

0

->操作者上的指針用來取消引用指針,然後應用.操作者。因此,例如,a->b相當於(*a).b

.運營商如你所說訪問一個成員變量。您已經注意到gE都是指針,但->運算符不能在E上運行的原因是因爲當您已經使用[]運算符E時,該運算符也可用作解引用程序。例如,行E[nEdges].to相當於(*(E + nEdges)).to而如果你試圖用在這種情況下,運營商->這將相當於(*(*(E + nEdges))).to這將是一個提領太多。

+1

非常感謝大家的解釋。我現在完全清楚發生了什麼:) – user1439690