迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C中的 Struct 和 Typedef Struct 之间的区别

作者:迹忆客 最近更新:2023/03/28 浏览次数:

本篇文章将借助代码示例解释和演示 C 编程中 structtypedef struct 之间的区别。


C中的 struct

使用数组时,我们定义变量的类型,该类型包含许多相同类型/种类的数据项。 类似地,我们在 C 编程中有另一种用户定义的数据类型,称为结构,它可以让我们组合不同类型的数据项。

我们还可以使用结构来表示记录。 例如,我们可以跟踪此人的详细信息,其中每个人都具有以下属性:

  • First Name
  • Last Name
  • Gender
  • Age
  • Mobile
  • Email
  • Address

C 中 struct 和 typedef struct 的区别

我们可以使用 structtypedef struct 定义结构,但是 typedef 关键字让我们可以为用户定义的数据类型(例如 struct)和原始数据类型(例如 int)编写替代名称。

typedef 关键字为已经存在的数据类型创建一个全新的名称,但不创建新的数据类型。 如果我们使用 typedef struct,我们可以获得更清晰、更易读的代码,而且它还可以让我们(程序员)免于击键。

typedef 结构可以简化声明变量,提供具有简化语法的等效代码。 但是,它可能会导致更混乱的全局名称空间,这可能会给更广泛的程序带来问题。

让我们为这两种情况(structtypedef struct)提供一个示例代码,并了解它们之间的区别。

没有 typedef 关键字的示例代码

#include<stdio.h>

struct Books{
    int   id;
    char  author[50];
    char  title[50];
};

int main() {
    //declare `book1` and `book2` of type `Books`
    struct Books book1;
    struct Books book2;

    //the specifications for the `book1`
    book1.id = 1;
    strcpy(book1.author,"Zara Ali");
    strcpy(book1.title,"Tutorials for C Programming");

    //the specifications for the `book2`
    book2.id = 2;
    strcpy(book2.author,"Zaid Ali");
    strcpy(book2.title,"Tutorials for Java Programming");

    //display information for `book1` and `book2`
    printf( "The id of book1: %d\n", book1.id);
    printf( "The author of the book1: %s\n", book1.author);
    printf( "The title of the book1: %s\n", book1.title);

    printf( "The id of book2: %d\n", book2.id);
    printf( "The author of the book2: %s\n", book2.author);
    printf( "The title of the book2: %s\n", book2.title);

    return 0;
}

输出结果如下:

The id of book1: 1
The author of the book1: Zara Ali
The title of the book1: Tutorials for C Programming
The id of book2: 2
The author of the book2: Zaid Ali
The title of the book2: Tutorials for Java Programming

上面的代码有两个 Books 类型的变量,book1book2。 如果我们需要声明更多变量,例如 book3book4 等,我们将不得不一次又一次地键入 struct

这就是 typedef 结构出现的地方。 请参阅以下显示 typedef 结构的使用的代码片段。

使用 typedef 关键字的示例代码

我们可以在以下两种方法中使用 typedef

方法一:

#include<stdio.h>

struct Books{
    int   id;
    char  author[50];
    char  title[50];
};

typedef struct Books Book;

int main() {
    //declare `book1` and `book2` of type `Book`
    Book book1;
    Book book2;

    //the specifications for the `book1`
    book1.id = 1;
    strcpy(book1.author,"Zara Ali");
    strcpy(book1.title,"Tutorials for C Programming");

    //the specifications for the `book2`
    book2.id = 2;
    strcpy(book2.author,"Zaid Ali");
    strcpy(book2.title,"Tutorials for Java Programming");

    //display information for `book1` and `book2`
    printf( "The id of book1: %d\n", book1.id);
    printf( "The author of the book1: %s\n", book1.author);
    printf( "The title of the book1: %s\n", book1.title);

    printf( "The id of book2: %d\n", book2.id);
    printf( "The author of the book2: %s\n", book2.author);
    printf( "The title of the book2: %s\n", book2.title);

    return 0;
}

输出结果如下:

The id of book1: 1
The author of the book1: Zara Ali
The title of the book1: Tutorials for C Programming
The id of book2: 2
The author of the book2: Zaid Ali
The title of the book2: Tutorials for Java Programming

方法 2:

#include<stdio.h>

typedef struct Books{
    int   id;
    char  author[50];
    char  title[50];
}Book;

int main() {
    //declare `book1` and `book2` of type `Book`
    Book book1;
    Book book2;

    //the specifications for the `book1`
    book1.id = 1;
    strcpy(book1.author,"Zara Ali");
    strcpy(book1.title,"Tutorials for C Programming");

    //the specifications for the `book2`
    book2.id = 2;
    strcpy(book2.author,"Zaid Ali");
    strcpy(book2.title,"Tutorials for Java Programming");

    //display information for `book1` and `book2`
    printf( "The id of book1: %d\n", book1.id);
    printf( "The author of the book1: %s\n", book1.author);
    printf( "The title of the book1: %s\n", book1.title);

    printf( "The id of book2: %d\n", book2.id);
    printf( "The author of the book2: %s\n", book2.author);
    printf( "The title of the book2: %s\n", book2.title);

    return 0;
}

输出结果如下:

The id of book1: 1
The author of the book1: Zara Ali
The title of the book1: Tutorials for C Programming
The id of book2: 2
The author of the book2: Zaid Ali
The title of the book2: Tutorials for Java Programming

第二种方法表明使用 typedef 似乎更有条理、更干净,并且易于理解和管理。


使用 typedef 关键字时的要点

在使用 typedef 关键字时,我们必须记住几点。 在上面给出的代码中,我们定义结构如下。

typedef struct Books{
    int   id;
    char  author[50];
    char  title[50];
}Book;

在这里,我们有一个新的结构类型,struct Books,以及 struct Books 的别名 Book。 您可能想知道为什么带有 typedef 的别名像任何其他普通声明一样出现在声明的末尾。

typedef 被放在与存储类说明符完全相同的说明符类别中,例如,autostatic 。 如果我们只想使用 Book 类型标识符,我们也可以不使用标签名称进行声明。

typedef struct{
    int   id;
    char  author[50];
    char  title[50];
}Book;

在使用结构时,我们必须注意所谓的变量和别名。 如果我们如下使用匿名结构(匿名是因为该结构没有名称),那么 Book 将是用户定义的数据类型结构变量。

struct{
    int   id;
    char  author[50];
    char  title[50];
}Book;

如果我们使用上面给出的相同结构但使用 typedef 关键字,那么 Book 将是数据类型结构的别名(同义词),我们可以使用它来声明变量(见下文)。

typedef struct{
    int   id;
    char  author[50];
    char  title[50];
}Book;

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便