typedef



30.typedef
C語言中的兩種類型:內建類型(編譯器自帶類型):ADT,用戶自定義類型:UDT
注意:typedef關鍵字定義(重命名)的是類型而不是變量。類型是一個模板,可以用來定義很多該類型的變量,沒有被分配內存的,而變量是佔內存的。
typedef char * pChar; //typedef 類型原型 新名字
#define pChar char * //#define 新名字   被替代字符(無分號)


結構體使用時都是先定義結構體類型,再用結構體類型去定義變量。C語言語法規定,結構體類型使用時必須是帶有struct在類型中:
struct 結構體類型名 結構體變量名;
/*************************struct student***************************/
//定義一個結構體,結構體類型爲struct student
struct student{
char name[20];
int age;
};
int main(void)
{
struct student s1; //用struct student結構體類型定義一個s1變量
s1.age = 12;
printf("s1 age = %d.\n",s1.age);


return 0;
}
/**************************struct student******************************/
/**************************typedef******************************/
//這裏用typedef重命名了struct student類型爲st,於是我們可以直接使用st類型來進行定義變量
typedef struct student{
char name[20];
int age;
} st;


int main(void)
{
st s1; //用struct student結構體類型定義一個s1變量
s1.age = 12;
printf("s1 age = %d.\n",s1.age);


return 0;
}
/**************************typedef******************************/
/**************************typedef pointer******************************/
//這裏一次性定義了2個結構體類型,一個是typedef struct student st,一個是typedef struct student * pst;st可以用來定義該結構體變量,pst可以用來該結構體指針變量。
typedef struct student{
char name[20];
int age;
} st, *pst;


int main(void)
{
st s1; //用struct student結構體類型定義一個s1變量
pst p; //用結構體指針類型別名進行定義一個變量p
struct student p1; //用結構體指針類型定義一個變量
p = &s1;
p->age = 12;
p1 = p;
printf("p age = %d.\n",p->age);
printf("p1 age = %d.\n",p1->age);


return 0;
}
/**************************typedef pointer******************************/


31.typedef 和const
typedef int *PINT; const PINT p2; 相當是:int * const p2;
typedef int *PINT; PINT  const p2; 相當是:int * const p2;
在typedef中定義好了類型之後再用const去修飾,那麼得到的結果都是const來修飾p2指針本身,p2不可改變,但p2指向的變量值可以改變。
如果確實想得到const int *p;這種const來修飾*p的,即*p的值是不可改變而p指針變量指向的對象是可以改變的,那我們就要在一開始定義類型的時候定義進去。即 typedef const int *CPINT; CPINT P1;這樣定義的p1變量就是*p不可變,p是可變的。
/**************************typedef const******************************/
typedef int *PINT;
typedef const int *CPINT;


int main(void)
{
int a = 23;
int b = 11;
PINT const p1 = &a;
const PINT p2 = &a;
CPINT p3 = &b;

*p1 = 5;
p1 = &b; //error: assignment of read-only variable 'p1'

*p2 = 4;
p2 = &b; //error: assignment of read-only variable 'p1'

*p3 = 3; //error: assignment of read-only variable '*p'
p3 = &b;
}
/**************************typedef const******************************/


32.使用typedef的重要意義:
簡化類型,可以將函數指針類型重命名爲比較簡單的名字。
創造平臺無關類型,在很多編程體系下,人們傾向於不適用int、double等C語言內建類型,因爲這些類型本身和平臺是相關的(如int在16位機器上是16位的,在32位機器上是32位的)。爲了解決這個問題,很多程序使用自定義的中間類型來做緩衝。
比如linux內核中就大量使用了這種技術,內核中先定義:typedef int size_t;然後在特定的編碼需要下用size_t來替代int。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章