在下面的代码中,“stk”被视为指针。但是从各个角度看了几个小时后,我不能为我的生活看到它是如何指针。有人可以解释一下我缺少的东西吗?
struct T {
int count;
struct elem {
void *x;
struct elem *link;
} *head;
};
T Stack_new(void) {
T stk;
NEW(stk);
stk->count = 0;
stk->head = NULL;
return stk;
}
我的解释说T是一个结构,因此stk是一个包含结构的本地自动变量。它是不是指针,但它被视为指针,让我陷入WTF状态。
更多背景 这段代码来自Hanson的一本名为“C接口和实现”的书。他创建了一个抽象数据类型库,它公开了一个接口并隐藏了实现。堆栈是他涵盖的第一个。我是一个刚刚进入C的长期程序员,显然有一些方法可以解析我缺少的这种语法。感谢。
如果它是相关的,这里是NEW的定义和新调用的东西:
#define NEW(p) ((p) = ALLOC((long)sizeof *(p)))
#define ALLOC(nbytes) \
Mem_alloc((nbytes), __FILE__, __LINE__)
extern void *Mem_alloc (long nbytes,
const char *file, int line);
答案 0 :(得分:3)
在上面的代码段中,T stk
会将stk声明为T
类型的变量。但是,类型T
未在任何地方定义,代码将无法编译。
如果它改为struct T stk;
,则将stk声明为具有类型struct T
的变量。但是,取消引用stk的尝试将毫无意义,代码将再次无法编译。
要使示例正常工作,您可以添加类似
的内容typedef struct T *T
将T
类型定义为pointer to struct T
。我会发现这非常令人困惑。