结构体(Struct)是编程语言中一种用户自定义的复合数据类型,它允许我们将多个不同类型的数据组合成一个逻辑整体,以便于管理和使用
前期已经分享过VBA中结构体的代码实现,可点击链接回顾: 【Excel VBA 编程】第66讲:不写类也能建模?结构体+函数驾驭复杂模型
然而,C语言和VBA中的结构体(在VBA中称为“用户定义类型”或 Type)虽然在核心思想上是相同的——都是用于将多个不同类型的数据项组合成一个新的复合数据类型,但是在具体的语法格式、功能特性以及应用场景上,存在一些关键差异
接下来仍旧以“ 图书 ”为例,说明如何使用C语言定义结构体、声明变量以及成员访问
一 、结构体定义及变量声明
C语言中结构体定义,不再使用type关键字,而是struct,常用的有以下3种书写格式:
格式1:标准定义, 先定义结构体类型,再声明变量
struct Book {char Title[100]; // 属性:书名char Author[100]; // 属性:作者char ISBN[20]; // 属性:ISBN号int Status; // 属性:状态int PageCount; // 属性:页数};变量声明:
struct Book libraryBooks[2];//一个包含2本书的数组格式2: 使用 typedef 简化为类型别名(推荐)
// 自定义数据类型:图书typedefstruct {char Title[100]; // 属性:书名char Author[100]; // 属性:作者char ISBN[20]; // 属性:ISBN号int Status; // 属性:状态int PageCount; // 属性:页数} Book;变量声明:
Book libraryBooks[2]; // 一个包含2本书的数组格式3: 在定义结构体类型的同时声明变量
struct Book {char Title[100]; // 属性:书名char Author[100]; // 属性:作者char ISBN[20]; // 属性:ISBN号int Status; // 属性:状态int PageCount; // 属性:页数}libraryBooks[2]; //一个包含2本书的数组二、 结构体中成员访问
结构体定义和变量声明后,接下来要探讨的就是如何访问结构体中成员,有两种方式:
方式一: 通过变量访问( 使用点运算符 . )
libraryBooks[0].PageCount = 566方式二: 通过指针访问( 箭头运算符 -> )
Book *ptr = &libraryBooks[0];//首先定义一个指向 Book 结构体类型的指针变量 ptr,并用libraryBooks[0] 的地址对其进行初始化ptr->PageCount = 570; // 使用箭头运算符而 在 VBA中,结构体(使用 Type...End Type 定义)的成员只能通过点运算符(.) 进行访问,而无法使用指针和箭头运算符(->)
三、完整示例代码
以格式2—— 使用 typedef 简化 定义结构体 为例,完整的代码如下,供大家参考:
#include#include// 定义图书状态常量#define BOOK_STATUS_AVAILABLE 0 //在馆#define BOOK_STATUS_BORROWED 1 //已借出// 自定义数据类型:图书typedefstruct {char Title[100]; // 属性:书名char Author[100]; // 属性:作者char ISBN[20]; // 属性:ISBN号int Status; // 属性:状态 (使用上面的常量)int PageCount; // 属性:页数} Book;// 显示图书信息的函数voidDisplayBookInfo(Book b){printf("书名: %s\n", b.Title);printf("作者: %s\n", b.Author);printf("ISBN: %s\n", b.ISBN);printf("状态: %s\n", b.Status == BOOK_STATUS_AVAILABLE ? "在馆" : "已借出");printf("页数: %d\n\n", b.PageCount);}// 主测试函数intmain{// 声明并使用花括号 {} 初始化结构体数组,每个元素直接整体初始化Book libraryBooks[2] = {{"三国演义", "罗贯中", "978-7-5002-7765-4", 1, 566},{"水浒传", "施耐庵", "978-7-5002-7228-1", 0, 727}};// 调用显示函数DisplayBookInfo(libraryBooks[0]);DisplayBookInfo(libraryBooks[1]);Book *ptr = &libraryBooks[0];//首先定义一个指向 Book 结构体类型的指针变量 ptr,并用libraryBooks[0] 的地址对其进行初始化ptr->Status = 0;//修改状态printf("*************状态修改后************\n");DisplayBookInfo(libraryBooks[0]);return0;}执行后结果如下
掌握了这些知识,就能在C语言中自如地使用结构体,构建复杂的数据结构,甚至后续在底层系统中模拟面向对象编程的思想