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