結構體typedef struct的用法 和結構體的定義html
結構體的定義:數組
1.函數
struct Person {spa
char name[20];指針
char sex;htm
float height;對象
int age;blog
}; 只有結構體的定義變量
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