一、结构体类型的声明
1、结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
2、结构体类型的声明
struct Stu//自己起的结构体类型名称
{
member-list;
}variable-list;//这里创建的变量是全局变量。而在main函数中创建的变量是局部变量。
3、结构成员的类型
结构成员的类型可以是标量、数组、指针或结构体。
二、结构体变量的定义和初始化
1、定义:
struct Stu
{
char name;
int age;
float weight;
}s1;//结构体变量的定义,全局变量
struct Stu s2;//结构体变量的定义,全局变量
int main()
{
struct Stu s3;//结构体变量的定义,局部变量
return 0;
}
2、初始化:用{}进行初始化。
struct m
{
char a;
int b;
float c;
};
struct Stu
{
struct m m1;
char name;
int age;
float weight;
};
int main()
{
struct m m1 = { 'a', 3, 3.14 };//结构体变量的初始化
struct Stu s = { { 'a', 3, 3.14 }, 'M', 18, 50.2 };//结构体变量的初始化,嵌套初始化
struct Stu s1={.name='G',.weight='56.2'};
return 0;
}
三、结构体成员访问
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct Stu
{
char name[20];
int age;
double score;
};
int main()
{
struct Stu s = { "阿大", 20, 85.5 };
printf("%s %d %lf\n",s.name,s. age,s.score);//第一种访问的方法
struct Stu* ps = &s;
printf("%s %d %lf\n",(*ps).name,(*ps).age,(*ps).score);//第二种访问的方法
printf("%s %d %lf\n", ps->name, ps->age, ps->score);//第二种方法的改进
return 0;
}
四、结构体传参
struct m
{
char a;
int b;
float c;
};
struct Stu
{
struct m m1;
char name;
int age;
float weight;
};
void print1(struct Stu x)
{
printf("%c %d %f %c %d %f\n", x.m1.a, x.m1.b, x.m1.c, x.name, x.age, x.weight);
}
void print2(struct Stu* x)
{
printf("%c %d %f %c %d %f\n",x->m1.a,x->m1.b,x->m1.c,x->name,x->age,x->weight);
}
int main()
{
struct Stu s = {{ 'a', 4, 3.14 },'M', 18, 50.2 };
//写一个打印s的函数。
print1(s);//传值调用
print2(&s);//传址调用,这种方法更好一些,应当首选。
return 0;
}
传值调用与传址调用应当首选传址调用,原因是:
函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能下降。