C語言型別定義

2021-06-22 14:35:58 字數 1614 閱讀 3774

對於使用者定義型別,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...