【C語言每天練(三)】typedef具體解釋

引言:數組

        typedef可以看做type define的縮寫,顧名思義就是類型定義,也就是說它僅僅是給已有的類型又一次定義了一個方便使用的別名。並無產生新的數據類型。函數


typedef與define的不一樣 ★★★★post

1.與#define不一樣,typedef給出的符號名稱僅限於對類型,而不是對值。spa

2.typedef的解釋由編譯器,而不是預處理器運行。.net

3.typedef比#define更靈活。指針


typedef的優點★★★blog

1.它使得定義更加直觀,從定義就可瞭解變量的某些信息。如作用域

       typedef unsigned int BYTE;get

       BYTE x, y[10], *z;編譯器

2.它可以使程序參數化,以提升程序的可移植性。如

time_t time(time_t *); 該函數返回的是time_t 類型的返回值。有些系統中 time_t 被定義爲unsigned long類型,而另一些系統中,可能被定義爲unsigned int 類型。這樣,在移植到不一樣的系統中時,僅僅要改變typedef定義,就可以在不一樣的系統中進行移植了。

3.表達方式更加簡潔。如

使用typedef命名一個結構體時。

typedef struct{

      double x; 

      double y;

}rect; 

rect r1 = {3.0, 6.0};

假設不使用typedef則顯得複雜。

struct {

       double x; 

       double y;

}r1 = {3.0, 6.0};


注意事項★★★★

       一、使用typedef定義的做用域取決於typedef語句所在的位置,假設定義是在一個函數內部,它的做用域就是局部的,限定在那個函數裏。

假設定義是在函數外部。它將具備全局做用域。

       二、typedef中聲明的類型在變量名的位置出現。而不是緊接在keywordtypedef以後。

       三、typedef在語法上相似於存儲類中的extern、static等,因此不能同一時候對一個變量類型使用typedef和static等。

       四、創建好數據類型名以後,可以使用它來進行類型聲明、類型轉換等。如:

       typedef char *String;

       String p, lineptr[MAXLINES], alloc(int); //類型聲明

       int strcmp(String, String); 

       p = (String)malloc(100); //類型轉換


typedef的常常使用範比例如如下:★★★

1.簡單的定義變量的別名。

     typedef char * PChar;

     PChar a, b; //至關於char *a; char *b;

2.與結構體的結合使用。

typedef struct Node{

       int a;

       char *b;

}*PNode;

PNode a, b;

3.對複雜的變量定義一個類型別名。

      typedef int  (*PF) (const char *, const char *)。這個聲明引入了 PF 類型做爲函數指針的同義字。該函數有兩個 const char * 類型的參數以及一個 int 類型的返回值。對複雜變量創建一個類型別名的方法很是easy,你僅僅要在傳統的變量聲明表達式裏用類型名替代變量名。而後把keywordtypedef加在該語句的開頭便可了。

比方:

       void (*signal (int signr,void (*handler)(int))) (int);可以經過兩次typedef來進行定義。

       typedef void sigfunc(int);

       sigfunc *signal(int signr,sigfunc *handler);

       當中typedef定義了一個有一個整型參數無返回值的函數類型。

void (*handler)(int)表示一個有一個整型參數無返回值的函數指針。這個指針名爲handler,因此其可以用sigfunc進行說明,此時sigfunc就至關於前面的int signr中int的做用;同理這個函數也是這樣。


分析複雜聲明的方法★★★

理解複雜聲明可用的「右左法則」:從變量名看起,先往右,再往左。碰到一個圓括號就調轉閱讀的方向;括號內分析完就跳出括號。仍是按先右後左的順序。如此循環,直到整個聲明分析完。舉例: 
       一、int (*func)(int *p); 
       首先找到變量名func,外面有一對圓括號,而且左邊是一個*號,這說明func是一個指針;而後跳出這個圓括號,先看右邊,又遇到圓括號,這說明(*func)是一個函數。因此func是一個指向這類函數的指針,即函數指針,這類函數具備int*類型的形參,返回值類型是int。

 
        二、int (*func[5])(int *); 
        func右邊是一個[]運算符,說明func是具備5個元素的數組。func的左邊有一個*,說明func的元素是指針(注意這裏的*不是修飾func,而是修飾func[5]的。緣由是[]運算符優先級比*高,func先跟[]結合)。跳出這個括號。看右邊。又遇到圓括號,說明func數組的元素是函數類型的指針,它指向的函數具備int*類型的形參,返回值類型爲int。 

參考:

http://blog.csdn.net/shadow_gz/article/details/4326106

http://blog.163.com/njut_wangjian/blog/static/165796425201232510265243/

相關文章
相關標籤/搜索