结构体
可以把他看做一个数组,不过数组储存的是数据类型一样的,而结构体则可以储存各种数据类型包括结构体类型也就是结构体嵌套。
基本用法
声明
struct是声明结构体的关键字,加上结构体的名字:
struct boy
{
int num;
char name[100];
char sex;
int age;
char addr[100];
};
这是声明一个名为boy的结构体,包括学号,姓名等等数据。声明后struct boy的作用就相当于int ,float一样。当然,也可以声明结构体数组。
声明结构体变量
有三种方式
struct boy student1;//声明后再声明变量,对比int
struct boy
{
int num;
char name[100];
char sex;
int age;
char addr[100];
}student1;//声明的时候就声明变量
struct
{
int num;
char name[100];
char sex;
int age;
char addr[100];
}student1;//这种不常用,相当于只要了一个变量,他没有名字
结构体成员的初始化与赋值操作
用 . 运算符取结构体中的变量进行初始化
student1.num = 10086;
student1.name = 张三;
······
或者点名道姓赋值
student1 = {.num = 10086;.name = 张三};
或者根据顺序一一对应放数据(对比数组)
student1 = {10086, 张三······};
未初始化默认为零。
注意:相同结构的结构体可以直接用赋值运算符复制数据
struct boy student1,student2;
student1 = {.num = 10086;.name = 张三};
student2 = student1;//这样可以直接给student2赋student1的值
结构体数组
与一般数组一样,结构体数组是连续储存多个相同的结构体的数据结构
struct boy student[5];//这里定义了含有5个student的数组
结构体做函数参数
void myinput(struct boy student[]);//声明里面必须要加struct关键字和变量名,参考int 型
void mydisp(struct boy student[]);
void myinput(struct boy student[])
{
int i;
for(i=0;i<sum;i++)
{
printf("请输入第%d个学生信息:\n",i+1);
printf("学号:");
scanf("%d",&student[i].num);//结构体名不能代表地址,所以用取地址运算符
printf("姓名:");
scanf("%s",student[i].name);//然而这个name是一个数组,所以不用取地址运算符
printf("性别:");
scanf(" %c",&student[i].sex);
printf("年龄:");
scanf("%d",&student[i].age);
printf("住址:");
scanf("%s",student[i].addr);
}
}
void mydisp(struct boy student[])
{
int i;
for(i=0;i<sum;i++)
{
printf("第%d个学生信息为:\n",i+1);
printf("学号:%03d\t姓名:%s\t性别:%c\t年龄:%d\t住址:%s\n",student[i].num,student[i].name,student[i].sex,student[i].age,student[i].addr);
}
}
结构体指针
指针无所不能,当然能指向结构体
struct boy *p;//定义指向boy结构体的指针
struct boy student;
p = &student;//给指针初始化
通过指针访问结构体数据有两种方法:
第一,解引用+点运算符
(*p).num = 10086;
...
第二,指针法—箭头运算符(自己取的名)
p->num = 10086;
...