typedef學習筆記

typedef學習筆記

在語句中所起的作用把語句原先定義變量變成了定義類型
比對一下兩個聲明:

         int    *p;
typedef  int    *p;
int *p 中, p是一個變量,其類型爲pointer to int;
在int *p前面增加一個typedef後,p變爲一個typedef-name,這個typedef-name所表示的類型就是int *p聲明式中p的類型(int*)。說句白話,typedef讓p去除了普通變量的身份,搖身一變,變成了p的類型的一個typedef-name了。

簡單的開始

類型定義的語法可以歸結爲一句話:只要在變量定義前面加上typedef,就成了類型定義。這兒的原本應該是變量的東西,就成爲了類型。

int integer;                  //整型變量
int *pointer;                 //整型指針變量
int array [5];                //整型數組變量
int *p_array [5];             //整型指針的數組的變量(中括號的優先級比較高,所以是數組,數組中元素是 int *)
int (*array_pointer) [5];     //整型數組的指針的變量(首先是指針,指向有5個int型元素的地址)
int function (int param);     //函數定義,也可將函數名看作函數的變量
int *function (int param);    //仍然是函數,但返回值是整型指針
int (*function) (int param);  //現在就是指向函數的指針了

若要定義相應類型,即爲類型來起名字,就是下面的形式:
typedef int integer_t;                      //整型類型
typedef int *pointer_t;                     //整型指針類型
typedef int array_t [5];                    //整型數組類型
typedef int *p_array_t [5];                 //整型指針的數組的類型
typedef int (*array_pointer_t) [5];         //整型數組的指針的類型
typedef int function_t (int param);         //函數類型
typedef int *function_t (int param);        //函數類型
typedef int (*function_t) (int param);      //指向函數的指針的類型

複雜一點

1.定義一個有10個指針的數組,該指針指向一個函數,該函數有一個整形參數,並返回一個整型
第一種方法:int (*a[10])(int);
第二種方法:typedef int (*pfunc)(int);
          pfunc a[10];
2.定義一個有10個指針的數組,該指針指向一個函數,該函數有一個函數指針(不帶參數,返回值爲空)參數,並返回空。
第一種方法:void (*a[10])(void (*)(void));
第二種方法:typedef void (*pfuncParam)(void);
          typedef void (*pfunc)(pfuncParam);
          pfunc a[10];
3.一個指向有10個函數指針(不帶參數,返回值爲double)數組的指針
第一種方法:double (*)(void) (*p)[10];
第二種方法:typedef double (*pfunc)(void);
          typedef pfunc (*pfuncParam)[10];
          pfuncParam p;
4.void (*b[10]) (void (*)());  
b是一個含有10個元素的數組,數組的元素是函數指針,該函數指針所指向的函數的返回值是void,函數的形參是另一個函數指針,這個函數指針沒有形參,返回值爲void
5.int (*func)(int *p);
首先找到變量名func,外面有一對圓括號,而且左邊是一個*號,這說明func是一個指針;然後跳出這個圓括號,先看右邊,又遇到圓括號,這說明(*func)是一個函數,
所以func是一個指向這類函數的指針,即函數指針,這類函數具有int*類型的形參,返回值類型是int6.int (*func[5])(int *);
func右邊是一個[]運算符,說明func是具有5個元素的數組;func的左邊有一個*,說明func的元素是指針(注意這裏的*不是修飾func,而是修飾func[5]的。原因是[]運算符優先級比*高,func先跟[]結合)。跳出這個括號,看右邊,又遇到圓括號,說明func數組的元素是函數類型的指針,它指向的函數具有int*類型的形參,返回值類型爲int7.double(*)() (*pa)[9]
pa是一個指針,指向一個含有9個元素的數組,數組的元素是一個函數指針,函數指針所指向的函數沒有形參,返回值是double型。

從變量名看起,先往右,再往左,碰到一個圓括號就調轉閱讀的方向;括號內分析完就跳出括號,還是按先右後左的順序,如此循環,直到整個聲明分析完。

總結

解讀時,兩個規律
1.當前層被下一層修飾;
2.先找到類型名,符號優先級確定下一層的方向

以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章