结构体的定义
自定义数据类型的一种,关键字struct,结构体类型的变量可以存储多个不同数据类型的数据
struct 结构体名
{
数据类型1 成员名称1;
数据类型2 成员名称2;
};
格式说明:
结构体名:单词首字母大写
数据类型n:C语言支持的所有类型
成员名称:合法的标识符
数据类型n 成员名称n:类似于定义变量,定义了结构体中的成员
注意:
结构体在定义的时候,成员不能赋值
常见的定义格式
方式1:常规定义(命名结构体,只定义类型)
struct Student
{
int num;
char name[20];
};
方式2:定义匿名结构体(常用于作为其他结构体的成员使用)
struct Dog
{
chat *name;
int age;
struct
{
int year;
int month;
}birthday;
};
注意:定义匿名结构体的同时必须定义结构体变量,否则错误,结构体可以作为另一个结构体的成员
总结:
1、结构体可以定义在局部和全局位置
2、全局位置和局部位置的结构体名可以相同,就近原则(和普通变量的定义同理)
结构体类型的使用:
利用结构体类型定义变量,定义数组;结构体类型的使用与基本数据类型的使用类似
结构体变量的定义:
三种形式定义结构体变量:
第一种:
先定义结构体
然后使用struct 结构体名 变量名;
struct A
{
int a;
char b;
}
struct A x;
第二种
在定义结构体的同时,定义结构体变量
struct A
{
int a;
char b;
}x,y;
struct A z;
第三种:
在定义匿名结构体的同时,定义结构体变量;
struct
{
int a;
chat b;
}x,y;
此时定义了一个没有名字的结构体(成为匿名结构体);y,x是这个匿名结构体类型的变量
应用场景:
当结构体的类型只需要使用一次,并且定义类型的同时定义变量
作为其他结构体的成员使用
定义结构体的同时,定义结构体变量初始化
struct Cat
{
int age;
char colot[20];
}cat;
结构体成员部分初始化时,大括号不能省略
结构体的成员,没有默认值,是不确定的数
结构体变量的使用
结构体变量访问结构体成员
格式
结构体变量名.成员名;
可以通过访问给成员赋值
通过访问获取成员的值
结构体变量未初始化,结构体的成员值随机
结构体变量在定义时,可以初始化
建议用大括号表明数据的范围
结构体成员初始化时,可以部分初始化,部分初始化时一定要带大括号表明数据的范围
//结构体变量的初始化
#include <stdio.h>
struct Dog
{
char *name;
int age;
char sex;
}
//先定义再初始化
void fun1()
{
//定义结构体变量
struct Dog dog;
//给结构体变量的成员赋值
dog.name = "旺财";
dog.age = 5;
//访问结构体变量的成员
printf("%s,%d,%c\n",dog.name,dog.age,dog.sex);
}
//定义的同时初始化
void fun2()
{
//定义结构体变量并初始化
struct Dog dog = {"找",23,'m'};
//访问结构体变量的成员
printf("%s,%d,%c\n",dog.name,dog.age,dog.sex);
}
int main()
{
fun1();
fun2();
return 0;
}
当需要管理多个学生对象,就需要一个结构体的数组
struct Student students[62];
三种形式定义结构体数组
第一种:先定义结构体类型,然后定义结构体变量,再将变量存储到结构体数组中
//定义一个学生类型的结构体
struct Student
{
char *name;
int age;
float scores[3];
}
//定义结构体对象
struct Student zhangsan = {"zhangsan",23,{2,3,56.6}};
struct Student lisi = {"lisi",24,{22,33,56.6}};
//定义结构化数组
struct Student student[3] = {zhangsan,lisi};
第二种:定义结构体类型,然后定义结构体数组并初始化
//定义一个学生类型的结构体
struct student
{
int id;
char *name;
float scores[3];
};
//定义结构体数组并初始化
struct Student student[3] = {
{1,"zhnagsan",23,{99,98,99.0}},
{2,"lisi",24,{99,98,99.0}}
};
第三种:定义结构体类型同时定义结构体数组并初始化
//定义一个学生类型的结构体
struct Student
{
int id;
char *name;
int age;
float scores[3];
}students[3] = {
{1,"zhnagsan",23,{99,98,99.0}},
{2,"lisi",24,{99,98,99.0}}
};
第四种:定义结构体类型同时定义结构体数组,然后通过索引给结构体成员赋值
//定义一个学生类型的结构体
struct Student
{
int id;
char *name;
int age;
float scores[3];
}sts[3];
sts[0].id = 1;
sts[0].name = "zhangsan";
sts[0].age = 12;
sts[0].scores[0] = 98;
结构体数组名访问结构体成员格式:结构体数组名->成员名