對於使用者定義型別,typedef和#define有什麼區別?
一般來說,最好使用typedef,部分原因是他能正確處理指標型別。例如這些宣告:
typedef char *string_t;
#define string_d char *
string_t s1,s2;
stirng_d s3,s4;
s1,s2,s3都被定義成了char*,但s4卻被定義成了char型,這可能並非原來所希望的。
#define也有他的優點,因為可以在其中使用#ifdef,另一方面,typedef具有遵守作用域規則的優點(也就是說,他可以在乙個函式或塊內宣告)
這樣似乎不能成功定義乙個鍊錶:
typedef struct*nodeptr;
難道在c語言中結構不能包含指向自己的指標嗎?
c語言中的結構當然可以包含指向自己的指標。
這裡的問題在於typedef。typedef定義了乙個新的型別名稱。在更簡單的情況下,可以同時定義乙個新的結構型別和typedef型別。但是這裡不行,不能再定義typedef型別之前就使用它。上邊的**片段中,在next域宣告的地方還沒有定義nodeptr。
要解決這個問題,首先賦予這個結構乙個標籤"struct node"。然後 ,宣告"next"域為"struct node*",或者分開typedef宣告和結構定義,或者兩者都採用,一下是修正後的版本:
typedef struct node*nodeptr;
也可以在宣告結構之前先用typedef,然後就可以宣告next域的時候使用型別定義nodeptr了:
struct node;
typedef struct node *nodeptr
struct node;
這種情況下,你在struct node還沒有完全定義的情況下就使用它來宣告乙個新的typedef,這是允許的。
最後,這是乙個兩種建議都採納的修改方法:
struct node;
typedef struct node *nodeptr;
如何定義一對相互引用的結構?
typedef struct*aptr;
typedef struct*bptr;
但是編譯器在遇到第一次使用bptr的時候,他還沒定義。
這裡的問題不在於結構或指標,而在於型別定義。首先,我們定義兩個結構標籤,然後定義鏈結指標。
struct a;
struct b;
對於結構a中的域定義struct b *bponiter,儘管編譯器此時尚未完成結構b的定義,但是他仍然可接受,有時候需要在這對定義之前加上這樣一行:
struct b;
這個空宣告將對結構宣告同外部作用域的struct b區分開來。
宣告了兩個帶結構標籤的結構之後,可以再區分定義兩個型別。
typedef struct a *aptr;
typedef struct b *bptr;
另外也可以先定義兩個型別,然後再使用這些型別來定義鏈結指標域。
struct a;
struct b;
typedef struct a *aptr;
typedef struct b *bptr;
struct a;
struct b;
c語言 自定義型別
struct stu 分號不能丟 匿名結構體型別 struct x struct a 20 p p x 非法的操作,上面倆種完全是不同的宣告 struct node 結構體的自引用 struct node n1 null 直接初始化 struct node n2 null 結構體巢狀初始化 先來看下...
C語言自定義型別
在學習c語言的時候,它有很多的自定義型別,例如 結構體,列舉,聯合。這些型別在我們的日常使用的時候,或多或少的都會遇見到,下面就系統的介紹一下這幾種型別。一.結構體 1.結構體型別的宣告 通俗點來說,結構就是一些值的集合,這些值稱為成員變數,結構體的每個成員可以是不同型別的成員變數。如下所示 str...
C語言之自定義型別
結構體型別的建立struct tag stu struct class struct class1 int main 這裡編譯器會把上邊兩個宣告當作不同的型別,而且如果我們在想建立乙個相同成員的結構體class2,就必須的在main 函式前邊建立,這樣及其不方便。struct tag class i...