結構體typedef struct的用法 和結構體的定義
結構體的定義:
1.
struct Person {
char name[20];
char sex;
float height;
int age;
}; 只有結構體的定義
2.
struct Person {
char name[20];
char sex;
float height;
int age;
} xiaohong; 附加該結構體類型的“結構體變量”的初始化定義結構體
這種定義就相當於
struct Person {
char name[20];
char sex;
float height;
int age;
};
struct Person xiaohong;
定義另一個結構體
struct Person xiaoming ; 定義一個變量名為xiaoming的結構體
這種每次都要加一個struct關鍵字的寫法有點麻煩
3.
typedef struct Person {
char name[20];
char sex;
float height;
int age;
}Per; 這種寫法在聲明結構體變量的時候就可以用 Per xiaoming;
如果沒有typedef 就必須用 struct Person,這里的Per實際上就是 struct Person的別名
typedef的用途
typedef可以看作是type define 的縮寫,意思就是定義類型,也可以說它是給已有的類型重新定義一個新的別名,而不是產生一個新的類型
typedef和宏定義有些類似,但是又有不同:
1.typedef給出的符號名稱僅限於對類型,而不是對值,並不是簡單的宏替換,可以用作同時聲明指針型的多個對象
typedef unsigned int BYTE; 將unisigned int 類型起一個別名 BYTE, 這樣我們定義unisigned int 類型的變量的時候就可以這樣寫 BYTE x,y;
typedef char *MYCHAR;
MYCHAR pa,pb; 同時聲明了兩個指向字符變量的指針
// char *pa,pb ; 這種寫法是聲明了一個指向字符類型變量的指針和一個字符類型的變量(一個是指針,一個是變量),雖然用char *pa,*pb也可以達到我們定義兩個字符指針的目的,但是這樣明顯不如用typedef來的方便。
2.可以使程序參數化,提高程序的移植性
type_myType doSomething(args *); 該函數的返回值是type_myType類型的,在一些系統中type_myType可能被定義成long類型,而有的系統中則被定義成 int類型,這樣我們在移植程序的時候不需要再去修改函數的返回類型,只需要修改typedef定義就好了。
3.可以使表達式更加簡潔,如上面的結構體的定義
4.能夠為其它復雜的聲明定義一個簡單的別名
原聲明: int *(*a[10])(int,cahr*); 這里的變量名為a, 我們用一個新的名字NEW_A來代替a,得到的簡化后的定義為: typedef int*(*NEW_A)(int,char *);
用新的名字來定義變量 NEW_A a[6];
可能一些小伙伴在回頭看這個表達式有些不大理解, 這個涉及到運算符的優先級的問題,可以回頭看看原來的書
理解復雜聲明可以用"右左法則":從變量名看起,先往右,在往左,碰到圓括號就調轉閱讀方向;括號內分析完畢就跳出括號,還是按照先右后左的順序,直到聲明分析完畢。
以上面的聲明為例: a為變量名稱,a的右邊有[ ],說明為數組,左邊有一個*,說明數組中的元素為指針類型,即一個含有10個元素的數組,元素的類型為指針(這里的*不是修飾a,而是修飾a[10],是因為[]的優先級要高於*),跳出括號,右邊又有一個括號,說明a數組的元素是指向函數類型的指針,而這個函數是參數為int,char* ,返回值為int *類型的函數。
本文部分內容引用地址:http://www.cnblogs.com/afarmer/archive/2011/05/05/2038201.html