C語言9之什麼是typedef型別

2021-08-16 02:03:08 字數 3870 閱讀 9099

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語言就是人和計算...