C语言5:结构体

目录

一 基本概念

二 结构体数组

三 应用:选票系统

需求:结构体包括姓名和票数,用户可以输入每个选民的名字来定义结构体,再逐次输入名字进行投票(唱票环节),最后输出当选者及其票数,还有弃票的数量(这里代码就不写了,业务逻辑蛮清晰的)

四 结构体指针

五 结构体函数

六 共用体/联合体

1.概念

2.应用:老师有姓名职业科目,学生有姓名职业班级,用结构体+共用体表达

七 枚举类

八 typedef关键字


一 基本概念

有点像java里的类的概念,可以用点运算符进行赋值,或者定义时大括号直接赋值

定义结构体时要和定义全局变量时一样加上“;”不同于函数

另外这里拓展了用字符串数组存汉字的方法:

#include <stdio.h>
#include <string.h>

struct Student{
	//char name[16] = "yzq";//不可以在结构体里赋值
	char name[16];
	char gender[3];//char类型大小只有一字节,一个汉字本身占2字节,且另外需要一个'\0'
	int age;
	char QQ[16];
};
int main(){
	//定义一个student
	struct Student student;
	//两种赋值方式
	struct Student student1 = {"YuZhaoQun","男",22,"2698271719"};
	//另一种
	strcpy(student.name,"wrx");
	strcpy(student.gender,"女");
	student.age = 3;
	strcpy(student.QQ,"1476062109");
	
	printf("%s\n%s\n%d\n%s\n",
	       student1.name,student1.gender,student1.age,student1.QQ);
		   
    printf("%s\n%s\n%d\n%s\n",
	       student.name,student.gender,student.age,student.QQ);
	return 0;
}

运行结果:

YuZhaoQun

22
2698271719
wrx

3
1476062109

二 结构体数组

形式类似二维数组

#include <stdio.h>
#include <string.h>

struct Student{
	char name[16];
	char gender[3];
	int age;
};
int main(){
	//结构体数组
	struct Student arr[3] = {{"a","男",16},{"b","女",18},{"c","男",21}};
	
	int len = sizeof(arr)/sizeof(arr[0]);
	for(int i = 0;i < len;i++){
		printf("%s\n%s\n%d\n",
	    arr[i].name,arr[i].gender,arr[i].age);
	}
	return 0;
}

三 应用:选票系统

需求:结构体包括姓名和票数,用户可以输入每个选民的名字来定义结构体,再逐次输入名字进行投票(唱票环节),最后输出当选者及其票数,还有弃票的数量(这里代码就不写了,业务逻辑蛮清晰的)

注意:唱票环节因为循环输入字符串时,不能确定每个名字长度一致,如:第一次输入“abc”第二次输入“mn”,那么第二次不清空字符串就直接读取的结果实际上是“mnc”,所以使用:

menset(String,'\0',sizeof(String));

四 结构体指针

换汤不换药

结构体指针变量用 -> 运算符,而不用 点运算符

#include <stdio.h>

struct Test{
	int Id;
	int Data;
};
int main(){
	struct Test test = {1,314};
	struct Test *p = &test;
	
	//变量名访问,用点访问
	printf("test:Id = %d\tData = %d\n",test.Id,test.Data);
	//变量名访问,用->访问
	printf("*p:Id = %d\tData = %d\n",p->Id,p->Data);
	
	p->Data = 273;
	printf("test:Id = %d\tData = %d\n",test.Id,test.Data);
	printf("*p:Id = %d\tData = %d\n",p->Id,p->Data);
	return 0;
}

再自己试试二维指针

用结构体指针改写一下“三 应用:选票系统”

五 结构体函数

不多解释,小心野指针

#include <stdio.h>

struct Test{
	int Id;
	int Data;
};

struct Test* put(struct Test *p){
	int Id;
	int Data;
	puts("请输入Id,和Data的值");
	scanf("%d%d",&Id,&Data);
	p->Id = Id;
	p->Data = Data;
	
	return p;
}

void get(struct Test *p){
	printf("*p:Id = %d\tData = %d\n",p->Id,p->Data);
}

int main(){
	struct Test test;
	struct Test *p = &test;
	
	p = put(p);
	get(p);
	
	return 0;
}

用函数继续改写一下“三 应用:选票系统”使其简洁一些

六 共用体/联合体

1.概念

像结构体但是有区别

结构体内存空间确定,每种变量已经分配好了内存

共用体一片混沌,一片储存空间里不一定存放的那种数据类型的变量

#include <stdio.h>

struct TestS{
	int Id;
	int Data;
};

union TestU{
	int Id;
	int Data;
};

int main(){
	struct TestS s1 = {1,314};
	union TestU u1;
	
	//不能这样定义 不然输出 2,2
	//union TestU u1 = {2,273};
	
	//数值覆盖了,照样不对,273,273
	//u1.Id = 2;
	//u1.Data = 273;
	
	//两变量在不同内存地址
	printf("s1:\nId in   0x%p\nData in 0x%p\n",&s1.Id,&s1.Data);
	//两变量在同一内存地址
	printf("u1:\nId in   0x%p\nData in 0x%p\n",&u1.Id,&u1.Data);
	
	printf("s1:\nId = %d\tData = %d\n",s1.Id,s1.Data);
	printf("u1:\nId = %d\tData = %d\n",u1.Id,u1.Data);
	return 0;
}

输出结果:

t1:
Id in   0x000000000061FE18
Data in 0x000000000061FE1C
u1:
Id in   0x000000000061FE14
Data in 0x000000000061FE14

2.应用:老师有姓名职业科目,学生有姓名职业班级,用结构体+共用体表达

#include <stdio.h>

struct Person{
	char name[16];
	char career;
	union{
		int class;
		char subject[16];
	}mes;	
};

int main(){
	struct Person p[2];
	
	int i;
	for(i = 0;i<2;i++){
		puts("请输入姓名:");
		scanf("%s",p[i].name);
		getchar();
		
		puts("请输入职业 t:老师 S:学生");
		scanf("%c",&p[i].career);
		
		if(p[i].career == 't'){
			puts("请输入老师的科目:");
			scanf("%s",p[i].mes.subject);
		}else if(p[i].career == 's'){
			puts("请输入学生的班级:");
			scanf("%d",&p[i].mes.class);
		}else{
			puts("输入错误,请重新输入");
			i--;
		}
	}

	for(i = 0;i<2;i++){
		if(p[i].career == 't'){
			printf("姓名:%s\t职业:Teacher\t科目:%s\n",
			p[i].name,p[i].mes.subject);
		}else{
			printf("姓名:%s\t职业:Student\t班级:%d\n",
		p[i].name,p[i].mes.class);
		}
	}

	return 0;
}

七 枚举类

不多解释,看代码

#include <stdio.h>

enum Day{
	Sunday,
	Monday,
	Tuesday,
	Wednesday,
	Thursday = 3,
	Friday,
	Saturday 
};
enum{
	January,February,March,April,May,June,
	July,August,September,October,November,December
}m1,m2;

int main(){
	enum Day d1 = Sunday;
	enum Day d2 = Wednesday;
	enum Day d3 = Thursday;
	enum Day d4 = Friday;
	
	printf("d1 = %d\n",d1);//d1 = 0
	printf("d2 = %d\n",d2);//d2 = 3
	printf("d3 = %d\n",d3);//d3 = 3
	printf("d4 = %d\n",d4);//d4 = 4
	
	m1 = July;
	m2 = February;
	
	printf("m1 = %d\n",m1);//m1 = 7
	printf("m2 = %d\n",m2);//m2 = 2
	
	return 0;
}

八 typedef关键字

前两种一般用于单片机,第三种属于作死用法:

#include <stdio.h>

typedef int u8;
typedef unsigned int u16;
typedef int arr[10];

int main(){
	u8 a = 100;
	u16 b = 11;
	arr c = {10};
	printf("%d",c[0]);
	return 0;
}

 一般用在这里比较方便:

#include <stdio.h>

struct Test{
	int Id;
	int Data;
};
//或者
typedef struct{
	int Id;
	int Data;
}Demo;//不是Demo变量的意思

typedef struct Test T;

int main(){
	T test = {2,666};
	T *p = &test;
	
	Demo d1 = {1,333};

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值