目录
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;
}