前言
C语言结构体的基础知识,结构体的声明,结构体成员的类型,结构体变量的定义和初始化,结构体变量定义,结构体变量初始化,结构体成员的访问,以及结构体传参。
一、结构的基础知识
- 结构时一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
二、结构的声明
结构体声明的内容如下:
struct tag
{
member-list;// 成员列表
}variable-list; //注意分号不能丢
- 说明
- struct 是结构体的关键字
- tag 是结构体标签,可以自己定义
- member-list 是成员列表,可以是不同类型的成员变量。
- variable-list 结构体变量,可以在创建类型的同时直接创建结构体变量。
struct Peo1
{
char name[20];
char sex[5];
char tele[12];
int age;
};
struct Peo2
{
char name[20];
char sex[5];
char tele[12];
int age;
}p1, p2;
// 这里的p1 和 p2是基于struct Peo2创建的结构体变量
// 并且结构体类型的声明在main函数外,所以是p1和p2全局变量
int main()
{
return 0;
}
三、结构体成员的类型
- 结构体成员可以是标量、数组、指针,甚至是其他结构体。
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int age;
};
struct S
{
struct Peo p; // 结构体变量 p 作为 struct S 的结构体成员
int num;
float pi;
};
int main()
{
return 0;
}
四、结构体变量的定义和初始化
1. 结构体变量的定义
-
- 可以直接在创建结构体类型的同时创建结构体变量。
-
- 可以使用 struct + 标签名 + 变量名 来创建全局或局部的结构体变量
// 结构的声明
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int age;
}p1,p2; // p1 p2 是全局的结构体变量
struct Peo p3; // p3 也是全局的结构体变量
int main()
{
struct Peo p4; // p4 局部的结构体变量
return 0;
}
- 说明
- 结构体类型也可以在main函数中创建,创建位置不同,则作用域不同。
- 一般情况下结构体类型都创建在全局。
- 结构体变量的作用域取决于定义结构体变量的位置,如上 p1 p2 p3就是全局变量,p4是局部变量。
2. 结构体变量的初始化
- 按照结构体成员变量的类型初始化即可。
- 结构体类型可以不完全初始化。
// 结构的声明
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int age;
};
struct S
{
struct Peo p; // 结构体变量 p 作为 struct S 的结构体成员
int num;
float pi;
};
int main()
{
struct Peo stu = {"张三", "男", "15588886666", 18};
struct S class = { {"lisi", "女", "15588886666", 20}, 100, 3.1415f };
return 0;
}
- 结构体类型中包含结构体,只要按照加{},按照成员变量的顺序初始化即可
五、结构体成员的访问
- 结构体成员有两种访问方式
-
- 结构体对象 + . + 成员变量
-
- 结构体指针 + -> + 成员变量
#include <stdio.h>
// 结构的声明
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int age;
};
struct S
{
struct Peo p; // 结构体变量 p 作为 struct S 的结构体成员
int num;
float pi;
};
void print1(struct Peo stu )
{
printf("%s %s %s %f\n", stu.name, stu.sex, stu.tele, stu.age); // 通过结构体对象.成员变量访问
}
void print2(struct Peo* s)
{
printf("%s %s %s %f\n", s->name, s->sex, s->tele, s->age); // 通过结构体指针->成员变量访问
}
int main()
{
struct Peo stu = { "张三", "男", "15588886666", 18 };
struct S class = { {"lisi", "女", "15588886666", 20}, 100, 3.1415f };
printf("%s %s %s %d\n", stu.name, stu.sex, stu.tele, stu.age);
//张三 男 15588886666 18
printf("%s %s %s %d %d %f\n", class.p.name, class.p.sex, class.p.tele, class.p.age, class.num, class.pi);
//lisi 女 15588886666 20 100 3.141500
print1(stu);
print2(&stu);
return 0;
}
六、结构体传参
- 函数形参是实参的一份临时拷贝。所以若直接传递结构体对象,会降低性能。
- 在结构体传参时,尽量采用结构体地址作为参数
总结
C语言结构体的基础知识,结构体的声明,结构体成员的类型,结构体变量的定义和初始化,结构体变量定义,结构体变量初始化,结构体成员的访问,以及结构体传参。