1.再論typedef
1.1 c語言的2種型別:內建型別與使用者自定義型別
內建型別adt、自定義型別udt
1.2 typedef定義(或者叫重新命名)型別而不是變數
1)型別是乙個資料模板,變數是乙個實在的資料。型別是不佔記憶體的,而變數是佔記憶體的。
2)物件導向的語言中:型別就是類class,變數就是物件。
1.3 typedef與#define巨集的區別
typedef char *pchar; //定義乙個資料型別char *,也就是每定義乙個變數都是char *型別。
#define pchar char * //#define巨集定義的東西都是原地展開的,就像內聯函式一樣,定義的不是型別,是原地展開。
需要注意的是:typedef定義型別時候,語句後面是有分號的!!define巨集語句後面沒有分號!!!
1.4 typedef與結構體
1)結構體在使用時都是先定義結構體型別,再用結構體型別去定義變數。
2)c語言語法規定,結構體型別使用時必須是struct 結構體型別名 結構體變數名;這樣的方式來定義變數。
3)typedef型別與普通定義結構體區別:
區別在於理解typedef的本質:定義的是乙個資料變數型別,首先是針對變數,其次是定義乙個型別!!
4)使用typedef一次定義2個型別,分別是結構體變數型別,和結構體變數指標型別。
1.5 幾種定義結構體的方法
1) 首先:注意在c和c++裡不同
在c中定義乙個結構體型別要用typedef:
typedef struct student
int a;
}stu;
於是在宣告變數的時候就可:stu stu1;(如果沒有typedef就必須用struct student stu1;來宣告)
這裡的stu實際上就是struct student的別名。stu==struct student
另外這裡也可以不寫student(於是也不能struct student stu1;了,必須是stu stu1;)
typedef struct
int a;
}stu;
但在c++裡很簡單,直接
struct student
int a;
於是就定義了結構體型別student,宣告變數時直接student stu2;
2)其次:
在c++中如果用typedef的話,又會造成區別:
struct student
int a;
}stu1;//stu1是乙個變數
typedef struct student2
int a;
}stu2;//stu2是乙個結構體型別=struct student
使用時可以直接訪問stu1.a
但是stu2則必須先 stu2 s2;
然後 s2.a=10;
3)掌握上面兩條就可以了,不過最後我們**個沒多大關係的問題
typedef struct和struct的區別:
typedef struct tagmystruct
int inum;
long llength;
} mystruct;
上面的tagmystruct是識別符號,mystruct是變數型別(相當於(int,char等))。
這語句實際上完成兩個操作:
a) 定義乙個新的結構型別
struct tagmystruct
int inum;
long llength;
分析:tagmystruct稱為"tag",即"標籤",實際上是乙個臨時名字,不論是否有typedefstruct 關鍵字和tagmystruct一起,構成了這個結構型別,這個結構都存在。
我們可以用struct tagmystruct varname來定義變數,但要注意,使用tagmystruct varname來定義變數是不對的,因為struct 和tagmystruct合在一起才能表示乙個結構型別。
b) typedef為這個新的結構起了乙個名字,叫mystruct。
typedef struct tagmystruct mystruct;
因此,mystruct實際上相當於struct tagmystruct,我們可以使用mystruct varname來定義變數。
4)typedef struct tagmystruct
int inum;
long llength;
} mystruct;
在c中,這個申明後申請結構變數的方法有兩種:
(1)struct tagmystruct 變數名
(2)mystruct 變數名
在c++中可以有
(1)struct tagmystruct 變數名
(2)mystruct 變數名
(3)tagmystruct 變數名
2. typedef與const
1) typedef int *pint; const pint p2; 相當於是int *const p2;
2) typedef int *pint; pint const p2; 相當於是int *const p2;效果一模一樣的
3) 如果確實想得到const int *p;這種效果,只能typedef const int *cpint; cpint p1;
3. 使用typedef的重要意義(2個:簡化型別、創造平台無關型別)
1)簡化型別的描述。
char *(*)(char *, char *); typedef char *(*pfunc)(char *, char *);
2)很多程式設計體系下,人們傾向於不使用int、double等c語言內建型別,因為這些型別本身和平台是相關的(譬如int在16位機器上是16位的,在32位機器上就是32位的)。為了解決這個問題,很多程式使用自定義的中間型別來做緩衝。譬如linux核心中大量使用了這種技術.
核心中先定義:typedef int size_t; 然後在特定的編碼需要下用size_t來替代int(譬如可能還有typedef int len_t)
3)stm32的庫中全部使用了自定義型別,譬如typedef volatile unsigned int vu32;
C語言筆記之typedef
typedef 這個關鍵字用於給乙個型別起個新的名字,和define不同,typedef 給出的符號名稱僅限於對型別 而不是對值。下面是乙個例子 typedef short wchar typedef將short型別定義成wchar型別,那麼以後遇到 wchar a 其實就是 short a 如果沒...
C語言系列文章之typedef
typedef 應該算是很熟悉的關鍵字了,但是我也只是簡單使用罷了,為了比較系統的講述這一小節,特地上網搜了一下。好了,現在正式開始講解。typedef 關鍵字可以用於給資料型別定義乙個別名,比如說你本名叫關谷神奇,我嫌棄這個名字太長了,所以給你取乙個別名,叫關谷,以後我叫關谷的時候你就知道在叫你了...
C語言概述 什麼是C語言?
一提到語言這個詞語,自然會想到的是像英語 漢語等這樣的自然語言,因為它是人和人交換資訊不可缺少的工具。而今天計算機遍布了我們生活的每乙個角落,除了人和人的相互交流之外,我們必須和計算機角落。用什麼的什麼樣的方式和計算機做最直接的交流呢?人們自然想到的是最古老也最方便的方式 語言,而c語言就是人和計算...