转自:http://flashcs3.blog.163.com/blog/static/1997203142013297569964/
问题1:两种声明有什么不同?
struct x1 {...};
typedef struct {...} x2;
答:第一种形式声明了一个结构标签,第二种声明了一个“类型定义”。主要区别在于第二种声明更抽象一些,用户不必知道它是一个结构,且在声明它的实例时也不需要使用struct关键字。例如:
x2 b;//是OK的
但是使用结构标签声明的结构就必须用这样的形式定义:
struct x1 a;
也可以同时使用
typedef struct x3 {...} x3;
尽管有些晦涩,但为标签和类型定义使用同样的名称是合法的,因为它们处于独立的命名空间中。
问题1:两种声明有什么不同?
struct x1 {...};
typedef struct {...} x2;
答:第一种形式声明了一个结构标签,第二种声明了一个“类型定义”。主要区别在于第二种声明更抽象一些,用户不必知道它是一个结构,且在声明它的实例时也不需要使用struct关键字。例如:
x2 b;//是OK的
但是使用结构标签声明的结构就必须用这样的形式定义:
struct x1 a;
也可以同时使用
typedef struct x3 {...} x3;
尽管有些晦涩,但为标签和类型定义使用同样的名称是合法的,因为它们处于独立的命名空间中。
问题2:结构体可以包含自己的指针吗?
当然可以,但是如果要使用typedef,则有可能产生问题。
例如:
typedef struct{
char *item;
NODEPTR next; //错误,不能在定义typedef类型之前使用它
}*NODEPTR;
版本1:
typedef struct node {
char *item;
struct node *next;
}*NODEPTR;
版本2:
struct node {
char *item;
struct node *next;
};
typedef struct node *NODEPTR;

运行环境:VC6.0
例子程序:tets.c
*************************************************************************************************
#include <stdio.h>
struct x1 //x1为结构标签
{
int a;
int b;
};
typedef struct
{
int c;
int d;
}tx; //tx为类型定义
typedef struct node
{
char item;
struct node *next; //结构体中定义指向自己的指针
}NODEPTR;
/*
typedef struct node
{
char *item;
NODEPTR next; //不可以,不能在typedef类型之前使用它
}*NODEPTR;
*/
void main(void)
{
struct x1 s1; //不能用结构标签自动生成类型定义名: x1 s1
tx s2;
NODEPTR node1;
NODEPTR node2;
node1.next = &node2;
s1.a = 1;
s1.b = 2;
s2.c = 3;
s2.d = 4;
node1.item = 'x';
node2.item = 'y';
printf("s1.a:%d, s1.b:%d \n",s1.a,s1.b);
printf("s2.c:%d, s2.d:%d \n",s2.c,s2.d);
printf("%c, %c \n",node1.item, node2.item);
}