【发布时间】:2011-11-04 04:28:14
【问题描述】:
每个人。
这是我写的一个测试程序。
#include <stdio.h>
#include <stdlib.h>
typedef struct _item {
int value;
} item , *pItem;
typedef struct _itemcontainer {
pItem i;
} itemcontainer, *pItemcontainer;
int main(void) {
item i;
i.value = 1;
pItem pi = &i;
pItem* ppi = π
itemcontainer ei = {&i};
pItem* pei = (pItem*)(&ei);
pItem api[1] = {&i};
printf("First case: %d\n", (*ppi)->value);
printf("Second case: %d\n", (*pei)->value);
printf("Third case: %d\n", (*api)->value);
return EXIT_SUCCESS;
}
三个 printf 函数的结果是相同的值,即 1。从代码来看,变量ei和api的初始化都是{&i}。所以我猜 pItem* pei = (pItem*)ei 应该可以工作,但是它失败了。谁能告诉我ei和api的区别?这似乎与编译器如何处理结构和数组有关,我不擅长。我需要一个具体的解释。提前致谢。
最好的祝福
呸呸
【问题讨论】:
-
许多人(包括我自己)认为
typedef指针类型是一种不好的做法。我使用typedef struct name name;,如果你想限制对成员的访问,struct name可以是一个不完整的类型,所以name *是一个指针,const name *是一个指向const的指针。我认为将语言的给定语法用于指针和consts 之类的东西更清楚,因为命名方案比内置语言语法更容易忘记(并且更难谷歌)。如果你使用name *,优秀的 C 程序员会知道,而不会想到需要清理它。