c语言(第4篇)结构体

目录

1.结构体定义

2.结构体数组

3.结构体指针

4.结构体指针函数

5.结构体二级指针

6.联合共用体


1.结构体定义

结构体是什么?
不同数据类型的组合体

为什么要用结构体?
当一条信息需要存放不同数据类型的时候

结构体书写方式?
 

#include <stdio.h>  //定义在main外部
#include <string.h>
struct Student   //结构体名称一般大写
{
	char name[10];  //初始定义时不赋值
	int number;
	int old;
	double scorse;
};    //可以再这里定义结构体变量  }std1,std2;          //末尾需要分号

int main(viod)
{	
	struct Student std1={"wd",2022,25,99.2};  //定义结构体中的变量struct Student和int类似
	struct Student std2; 
	//std2.name[1]='y';    //数组中的元素只能单个修改不能一起修改 
	//std2.name[2]='k';
	strcpy(std2.name,"yk");   //数组初始化方式1.初始化赋值2.下标法访问赋值3.指针复制
	std2.number=2021;   //结构体中域的赋值用点. 
	std2.old=22;
	std2.scorse=88.8;
	
	printf("%s同学的学号是:%d,他的年龄是%d,他的得分是%.2f \n",
		std1.name,std1.number,std1.old,std1.scorse);
	printf("%s同学的学号是:%d,他的年龄是%d,他的得分是%.2f",
		std2.name,std2.number,std2.old,std2.scorse); 
	return 0; 
} 

2.结构体数组

和普通数组的使用方式相同

#include <stdio.h>  //定义在main外部
#include <string.h>
#include <stdlib.h>
struct Select   //结构体名称一般大写
{
	char name[10];  //初始定义时不赋值
	int site;
};                 //末尾需要分号

int main(viod)
{	
	int array[6]={1,2,3};
	int ret=rand()%3;
	struct Select arr[6]={
		{"a",1},{"b",2},{"c",3},
		{"d",4},{"e",5},{"f",6},	
	};
	//printf("%d",ret);
	printf("中奖的幸运儿是:"); 
	printf("name:%s ,site:%d",arr[ret].name,arr[ret].site); 
	
	return 0; 
} 

3.结构体指针

结构体指针的定义

#include <stdio.h>  //定义在main外部

struct Select   //结构体名称一般大写
{
	char name[10];  //初始定义时不赋值
	int site;
};                 //末尾需要分号

int main(viod)
{	
	int a=10;
	int *pi=&a;
	
	char c='c';
	char *pc=&c;
	
	struct Select num2={"ssd",20};
	struct Select *ps=&num2;
	 
	return 0; 
} 

通过结构体指针访问内容

用 ->

//注意字符串数组是不能只给其中一个数赋值的 

//结构体的指针指向的是   一组域的第一个

#include <stdio.h>  //定义在main外部
#include <string.h>

struct Select   //结构体名称一般大写
{
	char name[10];  //初始定义时不赋值
	int site;
};                 //末尾需要分号

int main(viod)
{	
	int a=10;
	int *pi=&a;
	
	char c='c';
	char *pc=&c;
	
	struct Select num2={"ssd",20};
	struct Select *ps=&num2;
	
	printf("num2中name的值是:%s\n",num2.name);  //通过变量名访问结构体值用. 
	printf("num2中name的值是:%s\n",ps->name);  //通过指针访问结构体值用 -> 
	strcpy(ps->name,"ssssd") ;                  //注意字符串数组是不能只给其中一个数赋值的 
	printf("num2中name的值是:%s\n",ps->name);  //通过指针访问结构体值用 -> 
	
	return 0; 
} 

4.结构体指针函数

写一个票选系统,统计候选人和候选人的得票

#include <stdio.h>  //定义在main外部
#include <string.h>
#include <stdlib.h>

struct Select   //结构体名称一般大写
{
	char name[10];  //初始定义时不赋值
	int voter;

};                 //末尾需要分号

struct Select *start(struct Select* xm,int num)
{
	int i;
	xm=(struct Select*)malloc(num*sizeof(struct Select));
	
	for(i=0;i<num;i++){
		printf("请输入第%d选民的名字:",i+1); 
		scanf("%s",xm->name);
		xm->voter=0; 
		xm++;		
	}
	return xm-num;	
} 

struct Select *printxm(struct Select* xm,int num)
{
	int i;
	for(i=0;i<num;i++){
		printf("第%d个选民%s获得%d票 \n",i+1,xm->name,xm->voter); 
		xm++;
	}
	return xm-num;
	//xm=xm-num;
}

int vote(struct Select* xm,int num){
	int i,j,mark;
	int feipiao=0; 
	char vote_name[10];
	
	for(i=0;i<5;i++){   //一共投五个人 
		mark=0;
		printf("请输入你投票的人:"); 
		memset(vote_name,'\0',sizeof(vote_name)); 
		scanf("%s",&vote_name);
		for(j=0;j<num;j++){      //投的人和每个候选人比较 	
			if(strcmp(xm->name,vote_name)==0){
				xm->voter++;
				mark=1;
			}
			xm++; 	
		}
		if(mark==0){
			printf("没有此候选人 \n");
			feipiao++; 
		}
		xm=xm-num;  //回位
	}
	return feipiao;
} 

int win(struct Select* xm,int num){
	int i;
	struct Select* max;
	max=xm;
	for(i=0;i<num;i++){
		if(max->voter<xm->voter){
			max=xm;
		}
		xm++;
	}
	printf("%s以%d票当选",max->name,max->voter);
	return 0;

}

int main(viod)
{	
	struct Select * xm=NULL;
	int num;
	int feipiao;
	int winner_num;
	
	printf("请输入有多少个选民:");
	scanf("%d",&num); 
	xm=start(xm,num) ;
	xm=printxm(xm,num);
	feipiao=vote(xm,num);
	xm=printxm(xm,num);
	printf("\n共有%d人弃票\n",feipiao);
	win(xm,num);
	
	return 0;
} 

5.结构体二级指针

结构体二级指针和一级指针一样的用法

6.联合共用体

不同的数据存放在同一片内存空间

#include <stdio.h>  

struct Testt
{
	char a;  
	int b;
	double c;
};  

union Testu
{
	char a;  
	int b;
	double c;
};  


int main(viod)
{	
	struct Testt t1;
	union Testu u1; 
	
	printf("结构体t1的大小是%d位\n",sizeof(t1));
	printf("联合共用体u1的大小是%d位\n",sizeof(u1));
	
	printf("结构体t1中a的地址是%p\n",&t1.a);
	printf("结构体t1中b的地址是%p\n",&t1.b);
	printf("结构体t1中c的地址是%p\n",&t1.c);
	
	printf("联合共用体u1中a的地址是%p\n",&u1.a);
	printf("联合共用体u1中b的地址是%p\n",&u1.b);
	printf("联合共用体u1中c的地址是%p\n",&u1.c);
	
	return 0;
} 

注意联合体的数据覆盖问题。

联合共用体的应用:

#include <stdio.h>  

struct Test
{
	char name[20];   //注意如果定义的是字符串要加【20】 
	char carre;
	union D{
		char kemu[20];
		int class;
	}zhiye;  //可以从这里定义联合体变量 
};  

int main(viod)
{	
	struct Test p[2];
	int i;
	
	for(i=0;i<2;i++){
		printf("请输入值t代表老师,s代表学生。");
		scanf("%c",&(p[i].carre));
		if(p[i].carre=='t'){
			printf("请输入老师的名字:");
			scanf("%s",&(p[i].name));
			printf("请输入老师教学的科目:");
			scanf("%s",&(p[i].zhiye.kemu));		
		}else{
			printf("请输入学生的名字:");
			scanf("%s",&(p[i].name));
			printf("请输入学生的班级:");
			scanf("%s",&(p[i].zhiye.class));
		} 
		getchar();
	}
	for(i=0;i<2;i++){   //打印 
		if(p[i].carre=='t'){
			printf("请输入老师的名字:%s。老师教学的科目:%s \n",p[i].name,p[i].zhiye.kemu);	
		}else{
			printf("请输入学生的名字:%s 请输入学生的班级:%d \n",p[i].name,p[i].zhiye.class);
		} 
	}	
	
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值