结构体

1、结构体申明–定义–初始化

(1) 
struct Person
{
    char name[64];
    int age;
};
typedef struct Persin myPerson= { "Tom", 18 };;
(2)
typedef struct Person
{
	char name[64];
	int age;
}myPerson;      //无typedef关键字--myPerson为结构体别名

void test01()
{
	struct Person p = { "Tom", 18 };
	myPerson p2 = { "Jerry", 20 };
}
(3)
struct Person2
{
	char name[64];
	int age;
}myPerson2 = { "aaa", 20 };   //有typedef关键字--myPerson2为结构体变量

void test02()
{
	printf("姓名:%s 年龄%d\n", myPerson2.name, myPerson2.age);
}
(4) 匿名结构体
struct 
{
	char name[64];
	int age;
}myPerson3 = { "bbb", 30 };  //可附带一个变量,不能在通过结构体名创建变量

void test03()
{
	printf("姓名:%s 年龄%d\n", myPerson3.name, myPerson3.age);
}

2、结构体变量的创建

<1> 创建在栈上

struct Person
{
    char name[64];
    int age;
};

struct Person p = { "aaa", 10 };

	printf("姓名:%s  年龄: %d\n", p.name, p.age);

<2> 创建在堆区

struct Person
{
    char name[64];
    int age;
};

struct Person *p2=malloc(sizeof(struct Person);
strcpy(p2-name,"aaa");
p2->age=20;

printf("姓名:%s 年龄:%d",p2->name,p2->age);
if(p2!=NULL)
{
	free(p2);
	p2=NULL;
}

3、结构体变量数组创建

<1> 在栈上分配内存

void printArray( struct Person personArray[]  ,int len)
{
	for (int i = 0; i < len;i++)
	{
		printf("姓名 : %s ,年龄 : %d \n", personArray[i].name, personArray[i].age);
	}
}

struct Person
{
    char name[64];
    int age;
};

struct Person person[]=
{
    {"aaa",10},
    {"bbb",20},
    {"ccc",30},
    {"ddd",40},
};
int len=sizeof(person)/sizeof(struct Person);
printArray(persons, len);

<2> 在堆区分配内存

void printArray( struct Person personArray[]  ,int len)
{
	for (int i = 0; i < len;i++)
	{
		printf("姓名 : %s ,年龄 : %d \n", personArray[i].name, personArray[i].age);
	}
}

struct Person
{
    char name[64];
    int age;
};

struct Person * pArray = malloc(sizeof(struct Person) * 4);
for (int i = 0; i < 4;i++)
{
	sprintf(pArray[i].name, "name_%d", i + 1);
	pArray[i].age = 18 + i;
}

printArray(pArray, 4);

if (pArray != NULL)
{
	free(pArray);
	pArray = NULL;
}
	

4、结构体指针

结构体指针:指向结构体变量的指针

一个结构体变量的起始地址就是这个结构体变量的指针

<1> 指向结构体变量的指针

指向结构体对象的指针变量既可指向结构体变量,也可指向结构体数组中的元素

struct Student
{
	int num;
	char name[20];
	char sex;
	int age;
};

void test01()
{
	struct Student stu1={1001,"lili",'F',18};
	struct Student *p=&stu1;
	printf("num	name	sex	age\n");
	printf("%d	%s	%c	%d\n",stu1.num,stu1.name,stu1.sex,stu1.age);
	printf("%d	%s	%c	%d",p->num,p->name,p->sex,p->age); 
}
stu.num=====(*p).num=========p->num

<2> 指向结构体数组的指针

void test01()
{
	struct Student stu[3]={
		{1001,"lili",'M',15},
		{1002,"nini",'F',16},
		{1003,"nana",'M',17}
	};
	int len=sizeof(stu)/sizeof(struct Student);
	struct Student *p;
	printf("num	name	sex	age\n");
	int i=0;
	for(p=stu;p<stu+len;p++)
	{
		printf("%d	%s	%c	%d\n",p->num,p->name,p->sex,p->age);
	}
}

5、用结构体变量和结构体变量的指针做函数参数

将一个结构体变量的值传递给另一个函数,有三种方法:

(1) 用结构体变量的成员做参数

(2) 用结构体变量做实参

(3) 用指向结构体变量(或数组元素)的指针做实参,将结构体变量(或数组元素)的地址传给形参

有n个结构体变量,内含学生学号、姓名和三门课程的成绩。要求输出平均成绩最高的学生信息

struct Student
{
	int num;
	char name[20];
	float score[3];
	float aver;
};

//初始化学生信息
void Init_stu(struct Student stu[],int len)
{
	printf("请输入数据初始化学生\nnum name score[1] score[2] score[3]\n");
	int i=0;
	for(;i<len;i++)
	{
		scanf("%d %s %f %f  %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
		stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
	}
	
}


//打印学生信息
void Print(struct Student stu[],int len) 
{
	struct Student *p;
	printf("学生信息如下:\n学号	姓名	score[1] score[2] score[3] 	平均成绩\n");
	for(p=stu;p<stu+len;p++)
	{
		printf("%d	%s	%.4f  %.4f  %.4f	%.4f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->aver);
	}
}

//平均成绩最大值
struct Student *max_score_stu(struct Student stu[],int len)
{
	struct Student *p,*index;
	index=stu;
	for(p=stu+1;p<stu+len;p++)
	{
		p->aver>index->aver;
		index=p;
	}
	return index;
}

void test01()
{
	struct Student stu[3];
	int len=sizeof(stu)/sizeof(struct Student);
	
	//初始化学生信息
	Init_stu(stu,len);
	
	//打印学生信息
	Print(stu,len); 
	
	
	//平均成绩最大值
	struct Student *p=max_score_stu(stu,len);
	
	//打印平均成绩最大的学生信息
	printf("平均成绩最大的学生信息如下:\n");
	printf("学号:%d\n姓名:%s\n三门课成绩:%.1f %.1f %.1f\n平均成绩:%.2f",p->num,p->name,p->score[0],p->score[1],p->score[2],p->aver);
	 	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值