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 Main 函数 C 按值调用函数 C 按引用调用函数 C 嵌套函数 C 可变参数函数 C 用户定义函数 C 回调函数 C return 语句 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 指针 vs 数组 C 字符指针和函数 C NULL 指针 C void 指针 C 悬垂指针 C 解引用指针 C Near、Far 和 Huge 指针 C 指针数组的初始化 C 指针与多维数组

C 语言中的字符串

C 字符串 C 字符串数组 C 特殊字符

C 语言的结构体和联合

C 结构体 C 结构体和函数 C 结构体数组 C 自引用结构 C 查找表 C 点 (.) 运算符 C 枚举(或 enum) C 结构填充和打包 C 嵌套结构 C 匿名结构和联合 C 联合 C Bit 位字段 C Typedef

C 语言中的文件处理

C 输入和输出 C 文件 I/O(文件处理)

C 语言中的预处理器

C 预处理器 C #pragma 编译指示 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为此类声明分配快捷别名 -

typedefsigned 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 
Size 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 
", 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 
", u1.a, u1.b, u1.c);
   printf("a:%c b: %d c: %lf 
", 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 
Age: %d", e1.name, e1.age);

   return 0;
}

输出

运行此代码时,将产生以下输出 -

Name: Krishna 
Age: 25