我试着理解这个C代码:
typedef struct _IntElem *IntList;
typedef struct _IntElem { int head; IntList tail;} IntElem;
据我所知,它定义了递归类型list
。但是我不明白它的声明方式。我理解的是第二行,我们定义了一个名为IntElem
的结构,它由一个整数和一个IntList
组成。但是这个宣言中的_IntElem
是什么?
第一行是为列表分配内存吗?
答案 0 :(得分:4)
第一行
r<- raster(nrows=10, ncols=10)
r <- setValues(r, 1:ncell(r))
plot(r)
points(x=-50,y=20)
points(x=-50,y=-90)
coor1<- data.frame(Lat=-50,Lon=20)
point1 <- SpatialPointsDataFrame(
data.frame(coor1$Lon,coor1$Lat),
data.frame('Landriano')
)
x11()
plot(r)
plot(point1, add=T)
只是为 typedef struct _IntElem *IntList;
创建typedef
或别名。别名名为struct _IntElem *
。 FWIW,在这个时间点,编译器不需要知道IntList
的定义。
第二行
struct _IntElem
typedef struct _IntElem { int head; IntList tail;} IntElem;
,其中有两个成员,_IntElem
为head
,int
为tail
(IntList
ed更早)typedef
类型为typedef
。请注意:实际上没有为 type 创建任何变量(我不是在谈论成员变量,当然,它们是定义的一部分)。因此,没有分配内存。
所以,要明确
但是这个声明中的
IntElem
是什么?
_IntElem
是用户定义数据类型的名称。但是,在某些情况下,它是可选的。例如,
_IntElem
既完美又合法,除了事实,在这种情况下,我们正在为未命名的数据类型创建别名typedef struct { char name [32]; int age; float salary;} employee;
。
答案 1 :(得分:1)
在C中,如果我们有:
struct X
{
stuff....
};
然后X
被称为 struct tag 。这意味着struct X
是类型的名称。 X
本身不是类型的名称。事实上,X
本身就像任何其他未声明的标识符一样;此结构定义仅定义特定用法struct X
。
我们可能会说struct标签与其他标识符位于不同的名称空间中(不要与C ++名称空间混淆!)
有时人们不喜欢在任何地方输入struct X
。因此,他们使用typedef
(令人困惑的是,这意味着创建一个类型别名),以便创建一个名称类型的标识符:
typedef struct X SX;
表示SX
是一种类型。但由于struct标签位于自己的命名空间中,您甚至可以编写:
typedef struct X X;
表示X
本身与struct X
引用的类型相同。
希望您了解您现在正在查看的代码。我认为写起来会更清楚:
struct IntElem
{
int head;
struct IntElem *tail;
};
添加了可选的保存类型:
typedef struct IntElem IntElem;
指针typedef是邪恶的,因此可以完全省略IntList
。可能你可以保留它作为列表用户的 opaque类型,但你应该避免在列表实现过程中使用它。