- 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