结构体
1、结构体的基础知识
1.1结构的基础知识
结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
演示如下:
struct Stu //学生结构体
{
char name[20]; //字符类型
int age; //整型
float height; //浮点型
};
//结构体定义一般在主函数外,方便管理。
int main()
{
struct Stu zhang = { "张三", 19, 177.6 };
//一个学生包含姓名(字符),年龄(整形),身高(浮点型)。
return 0;
}
一个结构体可以包含多种类型数据,如上例包含字符类型、整型、浮点型。
1.2结构的声明
格式:
struct tag
{
member - list;
}variable - list;
演示如下:
struct Stu //声明包含结构体名 Stu
{
char name[20]; //声明包含结构体成员 姓名name
int age; //声明包含结构体成员 年龄 age
float height; //声明包含结构体成员 身高 height
}zhang; //声明包含结构体变量 zhang
int main()
{
return 0;
}
1.3结构成员的类型
结构体的成员可以是标量、数组、指针、其他结构体。
演示如下:
struct score
{
int Chinese;
int Math;
int English;
};
struct Stu
{
char name[20]; //字符类型
int* age; //整型
float height; //浮点型
struct score;
};
int main()
{
int a = 19;
int* pa = &a;
struct score g = { 90,90,90 };
struct Stu zhang = { "张三",pa,177.5,g };
return 0;
}
结构体 struct Stu 包含浮点型数、字符数组、整型指针、结构体struct score 。
1.4结构体变量的定义和初始化
格式1:
struct Point
{
int x;
int y;
}p1;
格式2:
struct Point p2;
演示如下:
struct Stu
{
char name[20];
int age;
float height;
}zhang = { "张三", 19, 177.6 };
//此类定义方式,结构体变量是全局变量。
int main()
{
struct Stu li = { "李四", 19, 188 };
//此类定义方式,结构体变量是局部变量。
return 0;
}
2、结构体成员的访问
1)结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
2)结构体指针访问指向变量的成员
演示如下:
struct score
{
int Chinese;
int Math;
int English;
};
struct Stu
{
char name[20]; //字符类型
int age; //整型
float height; //浮点型
struct score;
};
int main()
{
struct Stu z = { "张三",19,177.5,{90,90,90} };
struct Stu* pz = &z;
printf("%s %d %f %d %d %d\n", z.name, z.age, z.height, z.Chinese, z.Math, z.English);
//结构体变量访问结构体成员。
//打印结果 张三 19 177.500000 90 90 90
printf("%s %d %f %d %d %d\n", (*pz).name, (*pz).age, (*pz).height, (*pz).Chinese, (*pz).Math, (*pz).English);
//指针解引用的结构体变量访问结构体成员。
//打印结果 张三 19 177.500000 90 90 90
printf("%s %d %f %d %d %d\n", pz->name, pz->age, pz->height, pz->Chinese, pz->Math, pz->English);
//结构体指针访问结构体成员。
//打印结果 张三 19 177.500000 90 90 90
return 0;
}
上例中结构体指针解引用等同于结构体,所以可以用 (.)操作符访问。
3、结构体传参
通过地址传参可以节省内存空间。
演示如下:
struct Stu
{
char name[20]; //字符类型
int age; //整型
float height; //浮点型
};
void print1(struct Stu a)
{
printf("%s %d %f\n", a.name, a.age, a.height);
}
void print2(struct Stu* a)
{
printf("%s %d %f\n", a->name, a->age, a->height);
}
int main()
{
struct Stu z = { "张三",19,177.5 };
struct Stu* pz = &z;
print1(z); //打印结果 张三 19 177.500000 。
print2(pz); //打印结果 张三 19 177.500000
//传址调用效率更高,占用空间更小。
return 0;
}