我有以下代码:
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;”?请解释
答案 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
。
.
运算符如前所述访问成员变量。您已注意到g
和E
都是指针,但->
运算符无法在E
上运行的原因是因为您已经在使用[]
1}} E
上的运算符,也可以作为解除引用程序。例如,行E[nEdges].to
相当于(*(E + nEdges)).to
,而如果您尝试在此实例中使用->
运算符,那么它将等同于(*(*(E + nEdges))).to
,这也是一个解除引用许多。