#include <stdio.h>
typedef struct Birthday{
int year;
int month;
int day;
}Bir,Bir2; //两个都为类型,第二个为结构体变量的别名
typedef struct Student{
int id;//每个子变量用分号隔开
char *name;
int age;
float score;
Bir bithday;//嵌套的结构体
//......
}Stu;//若不加typedef,最后这个为变量而不是类型
//typedef struct Student stu;
//typedef将一个类型取一个新名字
//否则每一次用student都要struct student;
//可以在struct前直接声明typedef,省去了后面的操作
void printStudentInfo(Stu stu) {
printf("学号:%d\t姓名:%s\t年龄:%d\t成绩:%.2f\t生日:%d-%d-%d\n",
stu.id,stu.name,stu.age,stu.score,
stu.bithday.year,stu.bithday.month,stu.bithday.day);
}
//打印学生结构体信息
void printStudentInfoPPP(Stu *pStu) {
printf("学号:%d\t姓名:%s\t年龄:%d\t成绩:%.2f\t生日:%d-%d-%d\n",
pStu->id,pStu->name,pStu->age,pStu->score,
pStu->bithday.year,pStu->bithday.month,pStu->bithday.day);
}
//注意,使用结构体指针访问结构体成员时不用.运算符,而是使用->(箭头)来访问成员
//但在birthday那儿属于成员关系,得用.运算符
int main(){
//数据类型+变量名
Stu stu1={1001,"优香",17,100,{2006, 2, 7}};
//嵌套的结构体在赋值时再加一个括号就行
Stu stu2={1002,"诺亚",17,100,{2006, 2, 7}};
//访问结构体成员变量用.操作符(点操作符)
printf("学号:%d\t姓名:%s\t年龄:%d\t成绩:%.2f\t生日:%d-%d-%d\n",
stu1.id,stu1.name,stu1.age,stu1.score,
stu1.bithday.year,stu1.bithday.month,stu1.bithday.day);
//生日的引用,在Bir类型的变量后再加点以访问Birthday结构的内部数据
printf("学号:%d\t姓名:%s\t年龄:%d\t成绩:%.2f\t生日:%d-%d-%d\n",
stu2.id,stu2.name,stu2.age,stu2.score,
stu2.bithday.year,stu2.bithday.month,stu2.bithday.day);
//但是重复打印实在太雷同了,又长又臭,不太好操作与维护,故我们用函数来进行打印
Stu stu3={1145,"爱丽丝",1000,100,{1006, 2, 7}};
printStudentInfo(stu3);
//此处为值传递,要拷贝后再调用函数,是一个比较繁重的任务
//故此时可以用结构体指针,直接传递给函数以结构体的地址, 更加高效
Stu stu4={1200,"小桃",16,50,{2007, 2, 7}};
Student *pStu4 = &stu4;
// 必须用一个和号,取出stu4的地址,才可传递给指针,让指针指向stu4内部的东西
//声明结构体指针
printStudentInfoPPP(pStu4);
//生日结构体所占字节数
printf("生日结构体所占字节数%d\n", sizeof(Bir2));
//为3个int型相加
//内存对齐问题
//结构体内部的下一个元素若不够与第一个相同,会再与下一个结合成长度与它相同的内存
//从而达到内存对齐
//结构体数组的声明
Stu student[2]={
{1089,"小绿",16,60,{2007,2,7}},
{1789,"时",17,100,{2006,2,7}}
};
for(int i=0;i<2;i++){
Stu *p=&student[i];
printStudentInfoPPP(p);
}
int len = sizeof(student);
printf("%d\n", len);
//数组总的字节数
return 0;
}
C语言结构入门
最新推荐文章于 2024-05-06 13:31:22 发布