玩转C语言之自定义数据类型-typedef
玩轉C語言之自定義數據類型-typedef
1 引言
引言:在C語言中沒有提供字節類型,如果在工程中需要使用表示字節的變量時,該怎么辦呢?
我們知道 1 個字節占用 8 個二進制位空間,解決這個問題的辦法就是找個占用 8 個二進制位的內存空間的類型即可。
令我們開心的是, char 類型占用的內存空間正是 1 個字節,因此可以用 char 類型表示字節類型。
由于 char 類型表示的數值范圍是 [-128, 127],1 個字節表示的范圍是 [0, 255],為了能夠完全代替,我們使用 unsigned char 代表一個字節類型,unsigned char 表示的數值范圍正是 [0, 255]。
那么我們如果定義一個字節類型的數據,通過下面的方式即可:
unsigned char byte;通過上面這種方式,總是感覺怪怪的,因為不能夠清晰的看出 byte 是一個字節類型的數據。如果是我們自己閱讀代碼的話,還是能夠明白怎么回事的,但是身處這個開源、分享的領域,那么對于同行來說,他們就很難讀懂我們的代碼。
因此,為了解決這個問題,那么有請這篇文章的主人公閃亮登場——typedef。
2 什么是 typedef
typedef 是 C 語言中的類型命名關鍵字,通過這個關鍵字可以對類型賦予新的名字。其語法結構如下:
typedef Type NewTypeName;- Type 為已有的數據類型
- Name 為這個數據類型的新名字
注意:typedef 并沒有創建新的數據類型,而是對已有的數據類型賦予新的名字而已!!!
下面通過一個示例,練習一下 typedef 關鍵字的使用。
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 的應用
對于 typedef 的應用,在下面的場合中用的比較多:
- typedef 在函數中定義“局部類型名”
- typedef 簡化類型名(如:unsigned long long)
- typedef 定義類型名,能夠以統一的方式創建變量(Type var;)
typedef 的應用方法
- 先按定義變量的方法寫出定義體
- 將變量名換成新類型名
- 在最前面加上 typedef
- 然后可以用新類型名定義變量
按定義變量的方式,把變量名換上新類型名,并且在最前面加 typedef,即聲明了新類型名代表原來的類型。
(1)命名一個新的類型名代表結構體類型
typedef struct {int month;int day;int year; } Date;上面聲明了一個新類型名 Date,代表一個結構體類型,可以使用新的類型名定義變量,如:
- Date birthday;
- Date *p;
(2)命名一個新的類型名代表數組類型
typedef int Num[100]; Num a;(3)命名一個新的類型名代表指針類型
typedef char *String; String p, s[10]; // p 為字符指針變量,s 為字符指針數組(4)命名一個新的類型名代表指向函數的指針類型
typedef int (*P)(); P p1, p2;下面通過兩個例子,加深一下 typedef 的應用:
demo one
#include <stdio.h>typedef unsigned char byte;// 在函數的內部創建類型的新名字 // 這種情況下是具有局部的特性,出了這個函數就沒有作用了 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、元素個數為 5、值為數組 array 的地址的數組指針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 用法進階
(1)typedef 與 #define 的區別
- #define 是在預編譯時處理的,只能作簡單的字符串替換
- typedef 是在編譯階段處理的
(2)當不同源文件中用到同一類型時,常用 typedef 聲明一些數據類型,可以把所有的 typedef 名稱聲明放在一個頭文件中,然后在需要的文件中通過 #include 指令將其包含到文件中
(3)使用 typedef 有利于程序的通用與移植
總結
以上是生活随笔為你收集整理的玩转C语言之自定义数据类型-typedef的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何利用ChatGPT解决社会问题?
- 下一篇: 如何利用ChatGPT创造新的价值?