typedef struct node {
float x;
float fx;
} Node, *NodePtr; // 注意:這裡定義了兩個類型別名
| 聲明 | 實際類型 | 含義 |
|---|---|---|
Node n; | struct node | 結構體變量(值語義) |
Node *p; | struct node* | 指向結構體的指針 |
NodePtr p; | struct node* | 同上,別名更語義化 |
*Node p; | 編譯錯誤 | *Node 不是類型名,無法聲明變量 |
原問題中的 *Node p; 試圖用「解引用操作符 * + 類型名 Node」作為類型聲明,這在 C 語言語法中是**非法**的。正確的指針聲明形式只有:
類型名 * 變量名; 如 Node *p;typedef 類型名 * 別名; 後用 別名 變量名; 如 NodePtr p;typedef struct node *NodePtr;,避免在同一行混合定義值類型與指針類型造成誤讀Ptr 或 _ptr,如 NodePtr、ListNode_ptr*,提升代碼可讀性// 前向聲明,僅聲明類型存在,不定義內容
typedef struct Node Node;
typedef struct Node *NodePtr;
// 後續定義
struct Node {
int data;
NodePtr next; // 此處可直接用 NodePtr,因類型已聲明
};
此技巧常用於相互引用的結構體、對外隱藏實現細節的不透明指針模式。