玩转C语言之自定义数据类型-typedef
玩轉(zhuǎn)C語言之自定義數(shù)據(jù)類型-typedef
1 引言
引言:在C語言中沒有提供字節(jié)類型,如果在工程中需要使用表示字節(jié)的變量時,該怎么辦呢?
我們知道 1 個字節(jié)占用 8 個二進(jìn)制位空間,解決這個問題的辦法就是找個占用 8 個二進(jìn)制位的內(nèi)存空間的類型即可。
令我們開心的是, char 類型占用的內(nèi)存空間正是 1 個字節(jié),因此可以用 char 類型表示字節(jié)類型。
由于 char 類型表示的數(shù)值范圍是 [-128, 127],1 個字節(jié)表示的范圍是 [0, 255],為了能夠完全代替,我們使用 unsigned char 代表一個字節(jié)類型,unsigned char 表示的數(shù)值范圍正是 [0, 255]。
那么我們?nèi)绻x一個字節(jié)類型的數(shù)據(jù),通過下面的方式即可:
unsigned char byte;通過上面這種方式,總是感覺怪怪的,因?yàn)椴荒軌蚯逦目闯?byte 是一個字節(jié)類型的數(shù)據(jù)。如果是我們自己閱讀代碼的話,還是能夠明白怎么回事的,但是身處這個開源、分享的領(lǐng)域,那么對于同行來說,他們就很難讀懂我們的代碼。
因此,為了解決這個問題,那么有請這篇文章的主人公閃亮登場——typedef。
2 什么是 typedef
typedef 是 C 語言中的類型命名關(guān)鍵字,通過這個關(guān)鍵字可以對類型賦予新的名字。其語法結(jié)構(gòu)如下:
typedef Type NewTypeName;- Type 為已有的數(shù)據(jù)類型
- Name 為這個數(shù)據(jù)類型的新名字
注意:typedef 并沒有創(chuàng)建新的數(shù)據(jù)類型,而是對已有的數(shù)據(jù)類型賦予新的名字而已!!!
下面通過一個示例,練習(xí)一下 typedef 關(guān)鍵字的使用。
typedef unsigned char byte;int main() {byte b= 128;printf("sizeof(byte) = %d\n", sizeof(byte));printf("b = %u\n", b);return 0; }3 typedef 的應(yīng)用
對于 typedef 的應(yīng)用,在下面的場合中用的比較多:
- typedef 在函數(shù)中定義“局部類型名”
- typedef 簡化類型名(如:unsigned long long)
- typedef 定義類型名,能夠以統(tǒng)一的方式創(chuàng)建變量(Type var;)
typedef 的應(yīng)用方法
- 先按定義變量的方法寫出定義體
- 將變量名換成新類型名
- 在最前面加上 typedef
- 然后可以用新類型名定義變量
按定義變量的方式,把變量名換上新類型名,并且在最前面加 typedef,即聲明了新類型名代表原來的類型。
(1)命名一個新的類型名代表結(jié)構(gòu)體類型
typedef struct {int month;int day;int year; } Date;上面聲明了一個新類型名 Date,代表一個結(jié)構(gòu)體類型,可以使用新的類型名定義變量,如:
- Date birthday;
- Date *p;
(2)命名一個新的類型名代表數(shù)組類型
typedef int Num[100]; Num a;(3)命名一個新的類型名代表指針類型
typedef char *String; String p, s[10]; // p 為字符指針變量,s 為字符指針數(shù)組(4)命名一個新的類型名代表指向函數(shù)的指針類型
typedef int (*P)(); P p1, p2;下面通過兩個例子,加深一下 typedef 的應(yīng)用:
demo one
#include <stdio.h>typedef unsigned char byte;// 在函數(shù)的內(nèi)部創(chuàng)建類型的新名字 // 這種情況下是具有局部的特性,出了這個函數(shù)就沒有作用了 void func() {typedef byte uint8;uint8 var = 200;printf("sizeof(uint8) = %d\n", sizeof(uint8));printf("var = %u\n", var); }int main() {byte b = 128;func();printf("sizeof(byte) = %d\n", sizeof(byte));printf("b = %u\n", b);return 0; }demo two
#include <stdio.h>// 為 float[5] 定義新的名字為 fArray5 typedef float(fArray5)[5]; // 為 int(int, int) 定義新的名字為 iFuncII typedef int(iFuncII)(int, int);float array[5] = {0.1, 0.2, 0.3, 0.4, 0.5}; int add(int a, int b) {return a+b; }int main() {// 定義一個名為 pa、元素類型為 float、元素個數(shù)為 5、值為數(shù)組 array 的地址的數(shù)組指針fArray* pa = &array;// 定義一個名為 pf 的指針iFuncII* pf = add;int i = 0;for(i=0; i<5; i++){printf("%f\n", (*pa)[i]);}printf("%d\n", pf(i, i+1));return 0; }4 typedef 用法進(jìn)階
(1)typedef 與 #define 的區(qū)別
- #define 是在預(yù)編譯時處理的,只能作簡單的字符串替換
- typedef 是在編譯階段處理的
(2)當(dāng)不同源文件中用到同一類型時,常用 typedef 聲明一些數(shù)據(jù)類型,可以把所有的 typedef 名稱聲明放在一個頭文件中,然后在需要的文件中通過 #include 指令將其包含到文件中
(3)使用 typedef 有利于程序的通用與移植
總結(jié)
以上是生活随笔為你收集整理的玩转C语言之自定义数据类型-typedef的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何利用ChatGPT解决社会问题?
- 下一篇: 解决 No module named ‘