【问题标题】:What does it mean to typedef a struct as an array?将结构定义为数组是什么意思?
【发布时间】:2020-03-20 06:58:11
【问题描述】:

我书中的图邻接表代码由:

typedef struct vertexNode //vertexNode in an AdjacencyList
{
    VertexType data; 
    EdgeNodeType *firstEdgeNode;

} VertexNode, AdjList[MAXVEX];

AdjList adjList; # adjList is a MAXVEX-size array 

我对 typedef 中的最后一行感到困惑:typedef struct{...} AdjList[MAXVEX]

我能理解的形式是:

typedef struct{
...
} VertexNode,

VertexNode AdjList[MAXVEX]; # AdjList is a MAXVEX-size array 

struct{
...
} AdjList[MAXVEX]; # AdjList is a MAXVEX-size array 

【问题讨论】:

  • 注意:这种typedef 可以解锁一些技巧,例如implicit reference semantics in C
  • 非常感谢。这个先前的问题似乎也是我的困惑。那么..AdjList adjList 中的AdjList 是指针类型吗?
  • 不。 adjList 如果是普通声明,则为数组,仅当它是函数的参数时才为指针(就像向函数声明数组参数与声明指针参数一样)。

标签: c arrays struct typedef


【解决方案1】:

从语法上讲,typedef实际上是一个存储类,就像staticextern一样,类型别名声明读起来就像变量声明。例如

int x;

x 声明为int 类型的变量,而

typedef int x;

声明x 是一个类型别名,意思是int

同样,

struct vertexNode {
    ...
} VertexNode;

VertexNode 声明为struct vertexNode 变量,但添加typedef 使其成为struct vertexNode 的别名。注意struct vertexNode { ... }(整个)是一个类型,就像int一样。它首先定义struct vertexNode,然后引用它。

此外,当您使用逗号时,数组声明的行为可能看起来很奇怪:

int x, y[5];

x 声明为int,同时将y 声明为5ints 的数组。 (函数和指针也是这样。)本站还有其他问题。

把所有东西放在一起,如果你拿走typedef,你的问题看起来像这样:

struct vertexNode
{
    VertexType data; 
    EdgeNodeType *firstEdgeNode;
} VertexNode, AdjList[MAXVEX];

这将声明struct vertexNode 类型、struct vertexNode 类型的变量VertexNodeMAXVEXstruct vertexNodes 的数组AdjList。添加typedef 意味着VertexNode 成为struct vertexNode 的别名,AdjList 成为MAXVEXstruct vertexNodes 数组的别名。就个人而言,我不建议这样写,但我想它是简洁的。

【讨论】:

  • 非常感谢。我只是没见过typedef typeName arrayName[size]的写法。现在我明白了这句话的意思但是我真的不喜欢这种表达方式……
【解决方案2】:

这是一个示例代码。

#include <stdio.h>

typedef char STR[1024];

int main() {
    STR a = "1234";       // == char a[1024]
    printf( "%s\n", a );

    return 0;
}

我写了一个数据类型为char的例子。 您可以将其替换为任何类或结构..

所以..你的代码..

AdjList aVertexNode a[MAXVEX] 相同

【讨论】:

  • 感谢您的帮助。您的答案非常简单但有效。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 2020-04-29
相关资源
最近更新 更多