- C程式設計教程
- C - 首頁
- C語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境搭建
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 符號
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林值
- C語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof運算子
- C - 運算子優先順序
- C - 其他運算子
- C語言中的決策
- C - 決策
- C - if語句
- C - if...else語句
- C - 巢狀if語句
- C - switch語句
- C - 巢狀switch語句
- C語言中的迴圈
- C - 迴圈
- C - while迴圈
- C - for迴圈
- C - do...while迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break語句
- C - continue語句
- C - goto語句
- C語言中的函式
- C - 函式
- C - 主函式
- C - 按值呼叫函式
- C - 按引用呼叫函式
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者自定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 可變長陣列
- C語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指向指標的指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void指標
- C - 懸空指標
- C - 解引用指標
- C - 近、遠和巨型指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點(.)運算子
- C - 列舉(或列舉型別)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - Typedef
- C語言中的檔案處理
- C - 輸入和輸出
- C - 檔案I/O(檔案處理)
- C預處理器
- C - 預處理器
- C - 編譯指示
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類別
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static關鍵字
- C - 隨機數生成
- C - 命令列引數
- C程式設計資源
- C - 問答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C語言中的typedef
C typedef
C程式語言提供了一個名為typedef的關鍵字,用於為現有的資料型別設定一個替代名稱。C語言中的typedef關鍵字在為內建資料型別以及任何派生資料型別(如結構體、聯合體或指標)分配一個方便的別名方面非常有用。
有時,每次宣告變數時使用較長的名稱(例如“struct structname”或“unsigned int”)的資料型別會變得很麻煩。在這種情況下,我們可以分配一個方便的快捷方式,使程式碼更具可讀性。
typedef語法
通常,typedef關鍵字的使用方式如下:
typedef existing_type new_type;
typedef示例
在本章中,讓我們看一下typedef的一些用例。
示例1
在C語言中,關鍵字“unsigned”用於宣告只能儲存非負值的無符號整數變數。
C還有一個名為“short”的關鍵字,它宣告一個佔用2個位元組記憶體的整數資料型別。如果要宣告一個既是short又只能具有非負值的變數,則可以組合這兩個關鍵字(unsigned和short)
short unsigned int x;
如果要宣告許多此型別的變數,則每次都使用這三個關鍵字將不太方便。相反,您可以使用typedef關鍵字定義一個別名或快捷方式,如下所示:
typedef short unsigned int USHORT;
這告訴編譯器識別符號USHORT對應於“short unsigned int”型別。此後,您可以在變數宣告語句中使用USHORT:
USHORT x;
示例2
C還具有關鍵字static,用於指示此類變數僅初始化一次。“long”關鍵字在64位系統上分配8個位元組來儲存整數。我們可以如下宣告此型別的變數:
static unsigned long x;
但是,我們不能在“typedef”語句中使用關鍵字“static”,但是我們可以使用typedef為這種型別的宣告分配一個快捷別名:
typedef signed long SLONG; static SLONG x;
注意:按照約定,別名以大寫字母表示,只是為了區分內建型別和使用的別名。
示例3
以下示例演示瞭如何在C程式中使用別名:
#include <stdio.h>
int main() {
typedef short unsigned int USHORT;
typedef signed long int SLONG;
static SLONG x = 100;
USHORT y = 200;
printf("Size of SLONG: %d \nSize of USHORT: %d", sizeof(SLONG), sizeof(USHORT));
return 0;
}
輸出
執行此程式碼時,將產生以下輸出:
Size of SLONG: 8 Size of USHORT: 2
使用Typedef定義結構體
通常,我們需要透過在宣告語句中新增struct_type的名稱字首來宣告結構體變數,如下所示:
struct struct_type var;
如果以這種方式編寫型別名稱感覺很麻煩,則可以使用typedef分配一個別名:
typedef struct struct_type ALIAS;
示例
在此示例中,我們定義了一個結構體型別,然後使用typedef關鍵字為其設定一個別名:
#include <stdio.h>
int main() {
typedef unsigned long int ULONG;
typedef short int SHORT;
struct mystruct {
ULONG a;
SHORT b;
};
typedef struct mystruct STR;
STR s1 = {10, 20};
printf("%ld %u", s1.a, s1.b);
return 0;
}
輸出
執行程式碼並檢查其輸出:
10 20
可以使用typedef關鍵字的另一種方法。我們可以將其與結構體定義本身結合起來,如下所示:
typedef struct mystruct {
ULONG a;
SHORT b;
} STR;
STR s1 = {10, 20};
結構體指標的Typedef
typedef關鍵字也可用於為任何指標型別分配新的識別符號。通常,我們如下宣告指標變數:
struct mystruct * x;
相反,我們可以使用typedef關鍵字,如下所示:
typedef struct mystruct {
ULONG a;
SHORT b;
} STR;
typedef STR * strptr;
它允許您以更簡潔的方式宣告此型別的指標:
strptr ptr;
然後,我們可以將相應struct變數的地址分配給指標。
示例
以下示例顯示瞭如何使用typedef建立結構體指標:
#include <stdio.h>
int main() {
typedef unsigned long int ULONG;
typedef short int SHORT;
typedef struct mystruct {
ULONG a;
SHORT b;
} STR;
STR s1 = {10, 20};
typedef STR * strptr;
strptr ptr = &s1;
printf("%d %d \n", s1.a, s1.b);
printf("%d %d", ptr->a, ptr->b);
return 0;
}
輸出
執行此程式碼時,將產生以下輸出:
10 20 10 20
聯合體的Typedef
我們可以使用typedef關鍵字為任何聯合體型別分配快捷別名。
示例
以下示例說明了如何在建立聯合體時使用typedef:
#include <stdio.h>
int main() {
typedef unsigned long int ULONG;
typedef short int SHORT;
typedef union myunion {
char a;
int b;
double c;
} UNTYPE;
UNTYPE u1;
u1.c = 65.50;
typedef UNTYPE * UNPTR;
UNPTR ptr = &u1;
printf("a:%c b: %d c: %lf \n", u1.a, u1.b, u1.c);
printf("a:%c b: %d c: %lf \n", ptr->a, ptr->b, ptr->c);
return 0;
}
輸出
執行程式碼並檢查其輸出:
a: b: 0 c: 65.500000 a: b: 0 c: 65.500000
C語言中的typedef與#define
typedef關鍵字經常與#define指令混淆。在C語言中,#define是預處理器指令。它是定義常量的一種有效方法。
使用#define的語法如下:
#define name value
例如:
#define PI 3.14159265359
#define語句也可用於定義宏:
#define SQUARE(x) x*x
宏的工作原理類似於函式。但是,在呼叫時,值會在預處理器級別被替換。
printf("%d", SQUARE(5));
#define是預處理器指令,而typedef在編譯時進行評估。
- typedef僅限於為型別賦予符號名稱。#define也可用於為值定義別名。例如,您可以將“1”定義為“ONE”。
- typedef的解釋由編譯器執行,而#define語句由預處理器處理。
示例
在以下程式碼中,我們同時使用了這兩個功能(typedef和#define):
#include <stdio.h>
#define MAX 10
int main() {
typedef unsigned long int ULONG;
typedef short int SHORT;
typedef struct employee {
char name[MAX];
int age;
} EMP;
EMP e1 = {"Krishna", 25};
printf("Name: %s \nAge: %d", e1.name, e1.age);
return 0;
}
輸出
執行此程式碼時,將產生以下輸出:
Name: Krishna Age: 25