结构体(struct):是在C语言编程中,一种用户自定义可以使用的数据类型,且是由多个相同或不一样数据类型的数据项构成的一个集合。全部的数据项组合起来表示一条记录。(如:学生的结构体,数据项有学号、姓名、班级等等)编程
经常使用于定义的数据项类型:char、int、short、long、float、double、数组、指针、结构体等等。(结构体的成员变量数据类型)
数组
1.结构定义步骤:①使用结构体struct语句(形式以下) ②肯定定义结构体的内容 ③完成定义ide
struct 结构体名称{ char a; int b; //a,b,c……皆为结构体成员变量(结构体内容) double c; ………… }结构体变量;
PS:结构体名称、结构体内容、结构体变量,三者必有其二才能构成结构体。
函数
2.结构定义方式
例:学生结构体 (snumber为学号,sname为姓名,sclass为班级)
(1) 通常定义方式:学习
#include<stdio.h> /*最标准的定义方式*/ struct Student{ //结构体定义与变量声明分开 char snumber[16]; char sname[12]; char sclass[8]; }; int main(){ struct Student s1 = {"100001","张三","一班"};//声明结构体变量 printf("%s %s %s\n",s1.snumber,s1.sname,s1.sclass);//打印 return 0; }
PS:结构体定义的时候不定义变量。(最经常使用的定义方式)
指针
(2) 通常不用的定义方式:code
#include<stdio.h> /*通常不用的定义方式*/ struct Student{ //结构体定义与变量声明一块儿 char snumber[16]; char sname[12]; char sclass[8]; }s1 = {"100001","张三","一班"}; //声明结构体变量s1 int main(){ printf("%s %s %s\n",s1.snumber,s1.sname,s1.sclass);//打印 s1 struct Student s2 = {"100002","李四","二班"};//声明结构体变量s2 printf("%s %s %s",s2.snumber,s2.sname,s2.sclass);//打印 s2 return 0; }
PS:结构体定义的时候声明变量。
blog
(3) 最不提倡用的定义方式:图片
#include<stdio.h> /*最不提倡用的定义方式*/ struct{ //结构体定义与变量声明一块儿,但没有结构体名称 char snumber[16]; char sname[12]; char sclass[8]; }s1 = {"100001","张三","一班"};//此结构体就只能用一次 int main(){ printf("%s %s %s\n",s1.snumber,s1.sname,s1.sclass);//打印 return 0; }
PS:结构体定义的时候无结构体名称。(即此结构体只能用一次,浪费资源)
内存
(4) 带 typedef 的结构体:
①typedef 关键字做用:至关于给已有的数据类型取个其它的名字。以下:(使用方法)
#include<stdio.h> typedef int ZhengShu;//给 int 取个新名字 ZhengShu int main(){ ZhengShu a = 2;//声明整数变量 printf("%d",a); //打印 return 0; } //结果输出为:2
②使用 typedef 定义的结构体:(三种方法等价,书上常见第一种*)*
//第一种 /*用 typedef 定义结构体,无结构体名称*/ typedef struct{ char snumber[16]; char sname[12]; char sclass[8]; }SStudent; //给结构体取别名
//第二种 /*用 typedef 定义结构体,有结构体名称*/ typedef struct Student{ char snumber[16]; char sname[12]; char sclass[8]; }SStudent; //给结构体取别名
//第三种 /*通常定义结构体的方法,以后再用 typedef*/ struct Student{ char snumber[16]; char sname[12]; char sclass[8]; }; typedef struct Student SStudent;//用 typedef 给结构体取别名
/*以上三种结构体声明变量的方法相同*/ int main(){ SStudent s1 = {"100001","张三","一班"}; //声明一个结构体变量 printf("%s %s %s\n",s1.snumber,s1.sname,s1.sclass);//打印 return 0; }
结果:
PS:以上三种定义方法均可以用在实际编写代码中,且三种方法等价;具体用哪种,因我的习惯和偏心而因人而异。(吾比较喜欢第三种!)
1.结构体定义中使用其余结构体:
#include<stdio.h> struct Score{ //成绩结构体 int Math; int Chinese; int English; }; /*Score结构体必须比Student先定义或声明*/ struct Student{ //学生结构体 char snumber[16]; char sname[12]; char sclass[8]; struct Score sscore; }; //用 typedef 给结构体取别名 typedef struct Student SStudent; typedef struct Score SScore; int main(){ SScore score = {92,88,82}; //声明一个成绩结构体变量 SStudent s1 = {"100001","张三","一班",score}; //声明学生一个结构体变量,并存入成绩 printf("信息:%s %s %s\n 成绩:%d %d %d\n",s1.snumber,s1.sname,s1.sclass, //打印学生信息 s1.sscore.Math,s1.sscore.Chinese,s1.sscore.English); //打印成绩 return 0; }
结果:
2.两个结构体定义相互调用:
#include<stdio.h> /*通常不多用,了解定义结构就好了*/ struct B;//结构体 B 必须有不完整声明 struct A{ struct B *p; //结构体 A 中有结构体 B 的指针 }; struct B{ struct A *p; //结构体 B 中有结构体 A 的指针 };
3.结构体定义中使用自身结构体 (链表的结构体定义,后面有完整的链表建立使用方法)
#include<stdio.h> /*简单地建立使用链表*/ struct Node{ //结构体中使用自身结构体 int velue; struct Node *next;//结构体指针 (struct能够省略) };
1.普通指针:是一种用来存放内存地址的变量。(以下)
#include<stdio.h> /*指针的简单使用*/ int main(){ int x = 6; int *p; //一个整型指针 p = &x; printf(" 整数的地址:%p\n p指针存储的地址:%p\n p指针本身的地址:%p",&x,p,&p); return 0; }
结果:
2.结构体指针 (配合 结构体中使用的结构体的方法一块儿建立 链表)
#include<stdio.h> #include <stdlib.h> /*简单地建立使用链表*/ struct Node{ //结构体中使用自身结构体 int velue; struct Node *next;//结构体指针 (struct能够省略) }; //用 typedef 给结构体取别名 typedef struct Node* list; //链表 typedef struct Node Node_p; //节点 //建立链表 list MakeList(){ Node_p* head = (Node_p*)malloc(sizeof(struct Node));//结构体指针 if(head == NULL)printf("内存不足!"); //头节点 head->velue = 0; head->next = NULL; return head; } //判空 bool IsEmpty(list L){ return L->next == NULL; } //插入 void Insert(int x,list L){ Node_p *temp,*p;//结构体指针 temp = L; //到达位节点处 while(temp->next != NULL)temp = temp->next; //动态分配空间 p = (Node_p*)malloc(sizeof(struct Node)); if(p == NULL)printf("内存不足!"); //插入节点 p->velue = x; p->next = NULL; temp->next = p; } //遍历 void PrintAll(list L){ Node_p* temp = L->next; int i = 1; while(temp != NULL){ printf("第%d次=%d\n",i,temp->velue); temp = temp->next; i++; } } //主函数 int main(){ list L; L = MakeList(); //判断表是否为空 if(IsEmpty(L))printf("此链表为空!\n"); //添加元素 for(int i = 1;i <= 5; i++){ Insert(i,L); } //遍历(弹栈) PrintAll(L); return 0; }
结果:
1.结构体访问成员变量时的符号:
①" . "(点)
②" → "(箭头)
2.使用方法 (要访问结构体成员时)
①若是是结构体指针,则用箭头运算符访问。
②若是是结构体通常变量,则用点运算符。
PS:对比上面 学生结构体 和 链表结构体 ,试着交换一下访问符号试试。