心血管疾病在生药化工领域文献精读的思路与总结
2026/3/25 3:34:29
多层结构体和三维数组有相似之处,只是每个维度的数据类型可以不同。让我用多层结构体来类比:
// 三维数组:所有元素类型相同intarr[2][3][4];// 全是int类型// 多层结构体:每层可以不同类型structStudent{charname[20];intage;floatscore;};structClass{structStudentstudents[50];charteacher[20];};structSchool{structClassclasses[30];charprincipal[20];};#include<stdio.h>#include<string.h>// 第一层:学生信息structStudent{charname[50];intage;floatgpa;charmajor[30];};// 第二层:课程信息(包含学生数组)structCourse{charcourseName[50];charcourseCode[20];structStudentstudents[100];// 这门课的学生intstudentCount;};// 第三层:院系信息(包含课程数组)structDepartment{chardeptName[50];charbuilding[20];structCoursecourses[50];// 这个院系的课程intcourseCount;};// 第四层:大学信息(包含院系数组)structUniversity{charuniName[100];charlocation[50];structDepartmentdepartments[20];// 大学的院系intdeptCount;};intmain(){// 创建多层结构体实例structUniversitymyUni;strcpy(myUni.uniName,"清华大学");strcpy(myUni.location,"北京");myUni.deptCount=1;// 第一层院系strcpy(myUni.departments[0].deptName,"计算机学院");strcpy(myUni.departments[0].building,"信息楼");myUni.departments[0].courseCount=1;// 第二层课程strcpy(myUni.departments[0].courses[0].courseName,"C语言程序设计");strcpy(myUni.departments[0].courses[0].courseCode,"CS101");myUni.departments[0].courses[0].studentCount=2;// 第三层学生1strcpy(myUni.departments[0].courses[0].students[0].name,"张三");myUni.departments[0].courses[0].students[0].age=20;myUni.departments[0].courses[0].students[0].gpa=3.8;strcpy(myUni.departments[0].courses[0].students[0].major,"计算机科学");// 第三层学生2strcpy(myUni.departments[0].courses[0].students[1].name,"李四");myUni.departments[0].courses[0].students[1].age=19;myUni.departments[0].courses[0].students[1].gpa=3.9;strcpy(myUni.departments[0].courses[0].students[1].major,"软件工程");// 访问多层结构体数据printf("大学:%s\n",myUni.uniName);printf("院系:%s\n",myUni.departments[0].deptName);printf("课程:%s (%s)\n",myUni.departments[0].courses[0].courseName,myUni.departments[0].courses[0].courseCode);printf("学生1:%s,GPA:%.1f\n",myUni.departments[0].courses[0].students[0].name,myUni.departments[0].courses[0].students[0].gpa);return0;}// 游戏开发示例#include<stdio.h>#include<stdbool.h>// 第一层:物品属性structItem{charname[30];intvalue;intweight;bool isMagic;};// 第二层:背包格子structInventorySlot{structItemitem;intquantity;bool isEquipped;};// 第三层:玩家背包structPlayerInventory{structInventorySlotslots[20];// 20个背包格子intgold;intcapacity;};// 第四层:玩家角色structPlayerCharacter{charname[50];intlevel;inthealth;intmana;structPlayerInventoryinventory;structItemequippedItems[5];// 5个装备位};// 第五层:游戏存档structGameSave{structPlayerCharacterplayers[4];// 最多4个角色intplayTime;// 游戏时间(秒)charsaveName[50];charlocation[50];};// 使用示例voidaddItemToInventory(structPlayerCharacter*player,structItemnewItem){for(inti=0;i<20;i++){if(player->inventory.slots[i].quantity==0){player->inventory.slots[i].item=newItem;player->inventory.slots[i].quantity=1;printf("添加物品:%s\n",newItem.name);return;}}printf("背包已满!\n");}// 使用指针的多层结构体(更灵活)structProject{charname[100];structTask*tasks;// 动态数组inttaskCount;};structEmployee{charname[50];charposition[30];structProject*projects;// 指向项目数组intprojectCount;};structDepartment{charname[50];structEmployee*employees;// 指向员工数组intemployeeCount;doublebudget;};structCompany{charname[100];structDepartment*departments;// 指向部门数组intdeptCount;charCEO[50];};// 动态创建公司结构structCompany*createCompany(constchar*name){structCompany*company=malloc(sizeof(structCompany));strcpy(company->name,name);company->departments=NULL;company->deptCount=0;returncompany;}// 优势1:类型安全structPoint3D{floatx;// 可以是floatfloaty;// 可以是floatfloatz;// 可以是float};// 如果是三维数组,所有维度都是intintpoint[3];// 只能int类型// 优势2:命名访问structDate{intyear;// 含义明确intmonth;// 含义明确intday;// 含义明确};// 数组需要记住索引含义intdate[3];// 0=年?1=月?2=日?// 优势3:混合数据类型structMixedData{intid;// 整型charname[50];// 字符串floatsalary;// 浮点数bool isActive;// 布尔值};// 配置文件的多层结构体表示structDatabaseConfig{charhost[100];intport;charusername[50];charpassword[50];chardatabase[50];};structServerConfig{charhost[100];intport;intmaxConnections;inttimeout;};structAppConfig{charappName[50];charversion[20];structDatabaseConfigdb;structServerConfigserver;struct{charlogLevel[10];charlogFile[100];intmaxSize;}logging;// 匿名结构体};// 访问配置structAppConfigconfig;strcpy(config.appName,"MyApp");strcpy(config.db.host,"localhost");config.server.port=8080;config.logging.logLevel="DEBUG";| 特性 | 多层结构体 | 多维数组 |
|---|---|---|
| 数据类型 | 每层可以不同 | 必须相同 |
| 内存布局 | 可能包含padding | 连续紧凑 |
| 访问方式 | 通过字段名 | 通过索引 |
| 灵活性 | 高(可混合类型) | 低(单一类型) |
| 可读性 | 高(字段名有意义) | 低(索引无意义) |
| 用途 | 复杂数据结构 | 同质数据集合 |
多层结构体就像是"定制化的多维数组":
理解的关键是:结构体关注"是什么"(语义),数组关注"在哪里"(位置)。当你需要组织不同类型的数据时,用结构体;当处理大量同类型数据时,用数组。