C日志-结构体

本文详细介绍了C语言中结构体的使用,包括如何定义结构体、如何使用结构体存储和访问数据,以及如何通过指针操作结构体。文中展示了结构体在数组、比较、投票系统等场景的应用,同时讲解了共用体和枚举的概念,最后通过示例展示了结构体二级指针和typedef的用法。
摘要由CSDN通过智能技术生成

为什么用结构体?整合不同数据类型在一起

定义一个结构体

1告知系统是一个结构体struct

命名习惯大写开头

大括号外面要加;

他是一个模板,一般 不被赋值

一般长这样

struct Student
{
	int num;
	char name[32];
	char sex;
	int age;
	double score;
	char addr[32];
};

它的每一个成员是结构体中的一个域,也称为域表

用它

#include <stdio.h>
#include <string.h>
struct Student
{
	int num;
	char name[32];
	char sex[1];
	int age;
	double score;
	char addr[32];
};
int main()
{
	int a;
	struct Student stu1;
	stu1.num = 1;
	stu1.age = 10;
	stu1.score = 99.5;
	strcpy(stu1.name,"andy");
	strcpy(stu1.sex,"男");
	strcpy(stu1.addr,"北京");
	
	printf("stu1:学号:%d  姓名:%s  性别:%s  年龄:%d  成绩:%.1f  地址:%s\n"
	,stu1.num,stu1.name,stu1.sex,stu1.age,stu1.score,stu1.addr);
}

或者

struct Student
{
	int num;
	char name[32];
	char sex;
	int age;
	double score;
	char addr[32];
};
int main()
{
	struct Student stu2 = {2,"sirry",'g',12,65.3,"湖南"};
	printf("stu2:学号:%d  姓名:%s  性别:%c  年龄:%d  成绩:%.1f  地址:%s\n"
	,stu2.num,stu2.name,stu2.sex,stu2.age,stu2.score,stu2.addr);
}

输出成绩高的那一个

#include <stdio.h>
#include <string.h>
struct Student
{
	int num;
	char name[32];
	char sex;
	int age;
	double score;
	char addr[32];
};
int main()
{
	int a;
	struct Student stu1 = {1,"andy",'b',10,62.6,"北京"};
	struct Student stu2 = {2,"sirry",'g',12,65.3,"湖南"};
	struct Student max;
	
	max = stu1;
	if(stu1.score<stu2.score){
		max = stu2;
	}
	printf("stu1:学号:%d  姓名:%s  性别:%c  年龄:%d  成绩:%.1f  地址:%s\n"
	,max.num,max.name,max.sex,max.age,max.score,max.addr);
}

结构体与数组

#include <stdio.h>
#include <string.h>
struct Student
{
	int num;
	char name[32];
	char sex;
	int age;
	double score;
	char addr[32];
};
int main()
{
	int arr[3] = {1,2,3};
	int i;
	int len;
	
	struct Student arr2[3] = {
		{1,"anndy",'b',12,65.3,"湖南"},
		{2,"sirry",'g',13,75,"北京"},
		{3,"danne",'b',15,99.5,"深圳"}};
	len = sizeof(arr2)/sizeof(arr2[0]);
	for(i=0;i<len;i++){
		printf("stu1:学号:%d  姓名:%s  性别:%c  年龄:%d  成绩:%.1f  地址:%s\n",
arr2[i].num,arr2[i].name,arr2[i].sex,arr2[i].age,arr2[i].score,arr2[i].addr);
	}
	return 0;
}

选票系统

#include <stdio.h>
#include <string.h>
struct Xuanmin
{
	char name[32];
	int tickets;
};
int main()
{
	int i;
	int j;
	int len;
	struct Xuanmin xm[3];
	struct Xuanmin Max;
	char tmpName[32];
	int mark = 0;
	int qipiao = 0;
	
	int total = 5;
	//初始化选民信息
	len = sizeof(xm)/sizeof(xm[0]);
	for(i=0;i<len;i++){
		xm[i].tickets = 0;
		printf("请输入第%d个选民的名字:\n",i+1);
		scanf("%s",xm[i].name);
	}
	//唱票环节
	for(i=0;i<total;i++){
		mark = 0;
		printf("请输入你要投给谁:\n");
		memset(tmpName,'\0',sizeof(tmpName));//每次清空一下
		scanf("%s",tmpName);
		for(j=0;j<len;j++){//拿到名字,对应候选人票数+1
			if(strcmp(tmpName,xm[j].name)==0){
				xm[j].tickets++;
				mark = 1;
			}
		}
		if(mark==0){
			printf("没有此候选人,弃票\n");
			qipiao++;
		}
		
	}
	//公布结果
	for(i=0;i<len;i++){
		printf("候选人:%s  票数:%d\n",xm[i].name,xm[i].tickets);
	}
	printf("弃票数:%d\n",qipiao);
	//最高票数获得者
	Max = xm[0];
	for(i=1;i<len;i++){
		if(Max.tickets<xm[i].tickets){
			Max = xm[i];
		}
	}
	printf("%s以%d票当选!!!\n",Max.name,Max.tickets);
	return 0;
}

指针变量引入

结构体也是变量,也可以通过变量名和地址访问

	struct Test t1;
	struct Test* ps = &t1;

通过指针访问结构体

	struct Test t1 = {'c',18};//类型、名、值、地址
	struct Test* ps = &t1;
	
	printf("t1的idata值是:%d\n",t1.idata);//变量名访问
	printf("t1'的idata值是:%d\n",ps->idata);//指针访问
#include <stdio.h>
#include <string.h>
struct Student
{
	int num;
	char name[32];
	char sex;
	int age;
	double score;
	char addr[32];
};
int main()
{
	int i;
	int len;
	
	struct Student arr2[3] = {
		{1,"anndy",'b',12,65.3,"湖南"},
		{2,"sirry",'g',13,75,"北京"},
		{3,"danne",'b',15,99.5,"深圳"}};
	len = sizeof(arr2)/sizeof(arr2[0]);
	struct Student* p;
	p = arr2;
	for(i=0;i<len;i++){
		printf("stu1:学号:%d  姓名:%s  性别:%c  年龄:%d  成绩:%.1f  地址:%s\n",p->num,p->name,p->sex,p->age,p->score,p->addr);
		p++;
	}
	return 0;
}

改写选票系统

#include <stdio.h>
#include <string.h>
struct Xuanmin
{
	char name[32];
	int tickets;
};
int main()
{
	int i;
	int j;
	int len;
	struct Xuanmin xm[3];
	struct Xuanmin Max;
	struct Xuanmin* p = xm;
	char tmpName[32];
	int mark = 0;
	int qipiao = 0;
	
	int total = 5;
	//初始化选民信息
	len = sizeof(xm)/sizeof(xm[0]);
	for(i=0;i<len;i++){
		p->tickets = 0;
		printf("请输入第%d个选民的名字:\n",i+1);
		scanf("%s",p->name);
		p++;
	}
	p = xm;//指针归位
	//唱票环节
	for(i=0;i<total;i++){
		mark = 0;
		printf("请输入你要投给谁:\n");
		memset(tmpName,'\0',sizeof(tmpName));//每次清空一下
		scanf("%s",tmpName);
		for(j=0;j<len;j++){//拿到名字,对应候选人票数+1
			if(strcmp(tmpName,p->name)==0){
				p->tickets++;
				mark = 1;
			}
			p++;
		}
		if(mark==0){
			printf("没有此候选人,弃票\n");
			qipiao++;
		}
		p = xm;
	}
	//公布结果
	for(i=0;i<len;i++){
		printf("候选人:%s  票数:%d\n",p->name,p->tickets);
		p++;
	}
	printf("弃票数:%d\n",qipiao);
	//最高票数获得者
	p = xm;
	Max = xm[0];
	for(i=1;i<len;i++){
		if(Max.tickets < p->tickets){
			Max = xm[i];
		}
		p++;
	}
	printf("%s以%d票当选!!!\n",Max.name,Max.tickets);
	return 0;
}

当指针遍历完后下次使用之前一定记得归位

结合数组函数继续改进

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Xuanmin
{
	char name[32];
	int tickets;
};

struct Xuanmin* initXms(struct Xuanmin* p,int* pn)
{
	int i;
	if(p==NULL){
		printf("请输入有几个候选人:\n");
		scanf("%d",pn);
		p = (struct Xuanmin*)malloc(*pn * sizeof(struct Xuanmin));
	}
	for(i=0;i<*pn;i++){
		p->tickets = 0;
		printf("请输入第%d个选民的名字:\n",i+1);
		scanf("%s",p->name);
		p++;
	}
	return p-*pn;
}

void printXms(struct Xuanmin* p,int len)
{
	int i;
	for(i=0;i<len;i++){
		printf("候选人:%s  票数:%d\n",p->name,p->tickets);
		p++;
	}
}

int doVot(struct Xuanmin* p,int len)
{
	int i;
	int j;
	int mark;
	char tmpName[32];
	struct Xuanmin* pbak = p;
	int qipiao = 0;
	for(i=0;i<5;i++){
		mark = 0;
		printf("请输入你要投给谁:\n");
		memset(tmpName,'\0',sizeof(tmpName));
		scanf("%s",tmpName);
		p = pbak;
		for(j=0;j<len;j++){
			if(strcmp(tmpName,p->name)==0){
				p->tickets++;
				mark = 1;
			}
			p++;
		}
		if(mark==0){
			printf("没有此候选人,弃票\n");
			qipiao++;
		}
	}
	return qipiao;
}

struct Xuanmin* getMax(struct Xuanmin* p,int len)
{
	int i;
	struct Xuanmin* max;
	max = p;
	for(i=0;i<len;i++){
		if(max->tickets < p->tickets){
			max = p;
		}
		p++;
	}
	return max;
}

int main()
{
	struct Xuanmin* xm = NULL;
	struct Xuanmin* final;
	int total = 0;
	xm = initXms(xm,&total);
	int qip = doVot(xm,total);
	printf("弃票数:%d\n",qip);
	printXms(xm,total);
	final = getMax(xm,total);
	printf("最终%s以%d票当选!!!\n",final->name,final->tickets);
	return 0;
}

结构体二级指针

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Xuanmin
{
	char name[32];
	int tickets;
};

void initXms(struct Xuanmin** pxm,int* pt)
{
	int i;
	if(*pxm==NULL){
		printf("请输入有几个候选人:\n");
		scanf("%d",pt);
		*pxm = (struct Xuanmin*)malloc(*pt * sizeof(struct Xuanmin));
	}
	for(i=0;i<*pt;i++){
		(*pxm)->tickets = 0;
		printf("请输入第%d个选民的名字:\n",i+1);
		scanf("%s",(*pxm)->name);
		(*pxm)++;
	}
	*pxm = *pxm - *pt;
}

void printXms(struct Xuanmin* p,int len)
{
	int i;
	for(i=0;i<len;i++){
		printf("候选人:%s  票数:%d\n",p->name,p->tickets);
		p++;
	}
}

int doVot(struct Xuanmin* p,int len)
{
	int i;
	int j;
	int mark;
	char tmpName[32];
	struct Xuanmin* pbak = p;
	int qipiao = 0;
	for(i=0;i<5;i++){
		mark = 0;
		printf("请输入你要投给谁:\n");
		memset(tmpName,'\0',sizeof(tmpName));
		scanf("%s",tmpName);
		p = pbak;
		for(j=0;j<len;j++){
			if(strcmp(tmpName,p->name)==0){
				p->tickets++;
				mark = 1;
			}
			p++;
		}
		if(mark==0){
			printf("没有此候选人,弃票\n");
			qipiao++;
		}
		
	}
	return qipiao;
}

struct Xuanmin* getMax(struct Xuanmin* p,int len)
{
	int i;
	struct Xuanmin* max;
	max = p;
	for(i=0;i<len;i++){
		if(max->tickets < p->tickets){
			max = p;
		}
		p++;
	}
	return max;
	
}

int main()
{
	struct Xuanmin* xm = NULL;
	struct Xuanmin* final;
	int total = 0;
	initXms(&xm,&total);
	int qip = doVot(xm,total);
	printf("弃票数:%d\n",qip);
	printXms(xm,total);
	final = getMax(xm,total);
	printf("最终%s以%d票当选!!!\n",final->name,final->tickets);
	return 0;
	
}

共用体

与结构体的区别:结构体的元素有各自的内存空间,共用体元素空间共享,空间大小由最大的类型确定;结构体元素互不影响,共用体赋值会被覆盖

struct TestT
{
	int idata;
	char cdata;
	double ddata;
};

union TestU
{
	int idata;
	char cdata;
	double ddata;
};

int main()
{
	struct TestT t1;
	union TestU u1;
	printf("结构体t1的大小是:%d\n",sizeof(t1));
	printf("共用体u1的大小是:%d\n",sizeof(u1));
	return 0;
}

结构体t1的大小是:16
共用体u1的大小是:8

应用

#include <stdio.h>
struct Person
{
	char name[32];
	int age;
	char job;
	char addr[32];
	union{
		int class;
		char course[12];
	}mes;
};

int main()
{
	struct Person p[2];
	int i;
	for(i=0;i<2;i++){
		printf("请输入职业:(t代表老师,s代表学生)\n");
		scanf("%c",&(p[i].job));
		if(p[i].job=='s'){
			printf("请输入学生班级:\n");
			scanf("%d",&(p[i].mes.class));
			printf("请输入学生名字:\n");
			scanf("%s",&(p[i].name));
		}else{
			printf("请输入老师科目:\n");
			scanf("%s",&(p[i].mes.course));
			printf("请输入老师名字:\n");
			scanf("%s",&(p[i].name));
		}
		getchar();
	}
	for(i=0;i<2;i++){
		if(p[i].job=='s'){
			printf("学生的名字:%s,班级:%d\n",p[i].name,p[i].mes.class);
		}else{
			printf("老师的名字:%s,职业:%s\n",p[i].name,p[i].mes.course);
		}
	}
	return 0;
}

枚举类型

一个变量只有几种可能的值,例如星期几,也称枚举常量,

enum WeekDay{sun,mon,tus,wed,tur,fri,sat};

enum WeekDay w;
    w = wed;
    printf("w=%d\n",w);

>>>w=3

#include <stdio.h>
enum WeekDay{sun = 7,mon,tus,wed,tur,fri,sat};
int main()
{
	enum WeekDay w;
	w = wed;
	printf("w=%d\n",w);
	return 0;
}

>>>w=10

一般不这样

typedef

给已有的变量类型重新取名

#include <stdio.h>
typedef int zhengshu;
typedef char zifu;
typedef double xiaoshu;

int main()
{
	zhengshu a = 10;
	printf("a=%d\n",a);
	return 0;
}
struct Test
{
	int data;
};
typedef struct Test T;
int main()
{
	T t1;
	t1.data = 1000;
	printf("t1=%d\n",t1.data);
	return 0;
}

简洁

typedef struct
{
	int data1;
}D;
int main()
{
	D d1;
	d1.data1=159;
	printf("d1=%d\n",d1.data1);
    return 0;
}

练习

#include <stdio.h>
typedef struct
{
	int num;
	char name[32];
	char sex;
}Person,*pPerson;

void printInfo(Person p)
{
	printf("%d号姐姐:%s %c\n",p.num,p.name,p.sex);
}

void printInfo3(Person *p)
{
	printf("%d号姐姐:%s %c\n",p->num,p->name,p->sex);
}
void printInfo2(pPerson pp)
{
	printf("%d号姐姐:%s %c\n",pp->num,pp->name,pp->sex);
}

int main()
{
	Person p1 = {1,"莉莉",'g'};
	Person p2 = {2,"美美",'g'};
	printInfo(p1);
	printInfo(p2);
	
	pPerson pp1 = &p1;
	pPerson pp2 = &p2;
	printInfo2(pp1);
	printInfo2(pp2);
	
	Person *pp3 = &p1;
	Person *pp4 = &p2;
	printInfo3(pp3);
	printInfo3(pp4);
	return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

run sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值