問題1:兩種聲明有什麼不同?
struct x1 {...};
typedef struct {...} x2;
答:第一種形式聲明瞭一個結構標籤,第二種聲明瞭一個“類型定義”。主要區別在於第二種聲明更抽象一些,用戶不必知道它是一個結構,且在聲明它的實例時也不需要使用struct關鍵字。例如:
x2 b;//是OK的
但是使用結構標籤聲明的結構就必須用這樣的形式定義:
struct x1 a;
也可以同時使用
typedef struct x3 {...} x3;
儘管有些晦澀,但爲標籤和類型定義使用同樣的名稱是合法的,因爲它們處於獨立的命名空間中。
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);
}
*************************************************************************************************