首页 > 编程笔记 > C语言笔记(精华版)

C语言typedef struct用法详解(附带示例)

在C语言中,typedef 和 struct 两个关键字的组合,用来为结构体定义一个新的别名。有了别名以后,我们就可以通过这个别名来定义结构体变量了,不用每次都写 struct 关键字了。例如:

typedef struct stu{
    char name[20];
    int age;
    char sex;
} STU;

STU 是 struct stu 的别名,可以用 STU 定义结构体变量:

STU body1,body2;

它等价于:

struct stu body1, body2;

借助别名,以后使用结构体时就可以省略 struct 关键字了,这样看起来更加简洁,也更加容易理解。
 

要想彻底搞懂 typedef struct 的用法,我们还得从 typedef 关键字说起。

typedef 的用法

在C语言中,typedef 是一个常用的关键字,它允许程序员为现有的数据类型创建一个新的别名;这不仅可以提高代码的可读性,还能简化复杂的声明。typedef 的基本语法格式如下:

typedef 现有数据类型 新的类型名;

使用 typedef 可以为基本数据类型、指针类型、数组类型甚至是函数指针类型创建别名,请看下面的例子:

// 为基本数据类型创建别名
typedef int Integer;
typedef float Real;

// 为指针类型创建别名
typedef char* String;

// 为数组类型创建别名
typedef int IntArray[10];

int main() {
    Integer i = 10;  //等价于 int i = 10;
    Real r = 3.14;  //等价于 float r = 3.14;
    String s = "Hello";  //等价于 char* s = "Hello";
    IntArray arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  //等价于 int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    printf("Integer: %d\n", i);
    printf("Real: %.2f\n", r);
    printf("String: %s\n", s);
    printf("IntArray[0]: %d\n", arr[0]);
    
    return 0;
}

总起来说,typedef 用来为已有类型创建一个新的别名,从而简化代码的写法。注意,typedef 只能为数据类型创建别名,不能为变量创建别名。

typedef struct 的用法

现在,让我们深入探讨 typedef 与 struct 的组合使用。在C语言中,struct 用于定义结构体类型,这是一种复合的数据类型,可以将多个相关的、不同类型的变量组合在一起。而 typedef 与 struct 的结合使用,可以大大简化结构体的声明和使用。
 

通常,我们定义一个结构体后,每次使用时都需要在前面加上 struct 关键字:

struct point {
    int x;
    int y;
};
struct point p1;  // 声明一个 point 类型的变量,前面要加上struct关键字

但是,如果我们让 typedef 和 struct 结合,就可以为结构体创建一个新的别名,以后直接使用别名创建变量就可以了,就不用每次都在前边加 struct 关键字,这样使得代码更加简洁:

typedef struct point{
    int x;
    int y;
} Point;

Point p1;  // 不需要 struct 关键字

Point 就是 struct point 的别名。
 

为了更加简化,原来结构体的名字也可以不写:

typedef struct{  //原来的 point 被省略了
    int x;
    int y;
} Point;

Point p1;


此外,我们还可以在 typedef 中为结构体本身命名,这在需要在结构体内部引用自身时特别有用:

typedef struct Node {
    int data;
    struct Node* next;
} Node;

Node* head = NULL;  // 创建链表的头节点

在上面的例子中,我们定义了一个链表节点结构。由于结构体内部需要引用自身(next 指针指向同类型的结构体),我们在 struct 关键字后给出了结构体名称 Node。同时,typedef 也创建了 Node 作为这个结构体类型的别名。
 

typedef struct 的组合还特别适合用于创建跨平台的代码。例如,我们可以根据不同的平台定义不同的整数类型:

#ifdef _WIN32
typedef struct {
    long long x;
    long long y;
} LargePoint;
#else
typedef struct {
    long x;
    long y;
} LargePoint;
#endif

这样,无论在哪个平台上编译,LargePoint 都会是一个适合该平台的大整数点类型。
 

typedef struct 的组合不仅可以用于简单的结构体,还可以用于更复杂的数据结构。例如,我们可以定义一个二叉树节点:

typedef struct TreeNode {
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

TreeNode* root = NULL;  // 创建二叉树的根节点

通过这种方式,我们可以更容易地创建和操作复杂的数据结构,而不需要每次都写出完整的结构体定义。
 

总的来说,typedef struct 的组合使用来为结构体类型创建一个新的别名,这样在以后的使用过程中可以省略 struct 关键字,从而简化代码的写法,让代码看起来更舒服,更容易理解,此外,typedef struct 不仅简化了复杂类型的声明,还提高了代码的可移植性和可读性。

相关文章