目录
概念:
与数组类比:
结构体声明:
注意:
结构体变量、全局变量、局部变量:
结构体声明中包含其他结构体变量:
结构体变量的初始化:
包含了其他结构体变量的初始化:
结构体变量的打印:
包含其他结构体变量的打印:
结构体变量的传参:
直接传参:
地址传参:
两种传参的区别:
概念:
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
与数组类比:
数组是同一种类型的元素的集合,而结构体也是一种结合,且结构体内部的元素可以是不同类型的数据。
结构体声明:
struct tag
{
member-list;
}variable-list;
- struct是结构体的关键字,不可更改。
- tag是结构体的名字,或者标签,可以更改。
- member-list 结构体的成员列表,表示结构体内部的元素。
- variable-list 结构体的变量成员列表,表示类型是结构体的变量,可以省略。
注意:
声明只是表示结构体的类型,并不占内存的空间,只有结构体变量初始化或者进行改变的时候,才会占用内存空间。
结构体变量、全局变量、局部变量:
比如:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}p1,p2;
int main()
{
return 0;
}
p1和p2都是结构体struct peo类型的变量,而且是全局变量。
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}
int main()
{
struct peo p;
return 0;
}
p是结构体 struct peo类型的变量,但是它是局部变量。
结构体声明中包含其他结构体变量:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}
struct st
{
struct peo p;
int num;
float f;
}
int main()
{
struct peo p;
return 0;
}
结构体struct st中包含了结构体struct peo类型的变量 p
结构体变量的初始化:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}
int main()
{
struct peo p = {"张三","15596668862", "男", 181};
return 0;
}
包含了其他结构体变量的初始化:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}
struct st
{
struct peo p;
int num;
float f;
}
int main()
{
struct st s = { {"lisi","15596668888","女",166},108,3.14f};
return 0;
}
- 在包含其他结构体的变量时,进行初始化也要把其他结构体变量中的内容进行初始化。
- 比如以上代码中的{"lisi","15596668888","女",166}就是结构体声明struct st中的另一个结构体变量struct peo p的变量的初始化。
结构体变量的打印:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}
int main()
{
struct peo p = {"张三","15596668862", "男", 181};
printf("%s %s %s %d\n", p.name, p.tele, p.sex, p.high);
return 0;
}
结构体打印的时候需要使用操作符 “ . ” 进行指引。
格式:结构体变量名 . 结构体成员名
包含其他结构体变量的打印:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}
struct st
{
struct peo p;
int num;
float f;
}
int main()
{
struct st s = { {"lisi","15596668888","女",166},108,3.14f};
printf("%s %s %s %d %d %f\n", s.p.name, s.p.tele, s.p.sex, s.p.high, s.num, s.f);
return 0;
}
包含其他结构体变量的打印方式如以上代码所示。
本结构体变量名.其他结构体变量名.列表成员名 —打印出其他结构体变量内部的结构体成员名的格式。
结构体变量的传参:
直接传参:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}
void print1(struct Peo p)
{
printf("%s %s %s %d\n", p.name, p.tele, p.sex, p.high);
}
int main()
{
struct peo p = {"张三","15596668862", "男", 181};
print1(p1);
return 0;
}
地址传参:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}
void print2(struct Peo *sp)
{
printf("%s %s %s %d\n",sp->name, sp->tele,sp->sex,sp->high);
}
int main()
{
struct peo p = {"张三","15596668862", "男", 181};
print2(&p1);
return 0;
}
传参地址,在打印的时候需要使用指针名->结构体成员名的格式
void print2(struct Peo *sp)
{
printf("%s %s %s %d\n",sp->name, sp->tele,sp->sex,sp->high);
}
void print1(struct Peo p)
{
printf("%s %s %s %d\n", p.name, p.tele, p.sex, p.high);
}
两种传参的区别:
- 实参直接传给形参,其实是一种拷贝,形参也要开辟一个和实参一样大的空间,而后将实参的数据拷贝给形参,但是这样子会造成空间浪费,拷贝数据时也会浪费相对因的时间,若实参越大,浪费的空间越大,拷贝的时间越多。
- 把结构体变量的地址作为实参传递给形参,形参就只需要创建一个指针的变量空间,通过这个指针变量找结构体的所在空间位置,进行读取数据。
结论:所以结构体传参的时候一般使用传递结构体变量的地址进行传参。