结构是一些值的集合,这些值被称为成员变量。结构的每个成员可以是不同类型的变量。
struct tag
{
member - list;
}variable-list;
例:描述一个人的信息:名字+电话+性别+身高
//声明的结构体类型struct peo
struct peo
{
char name[20];//名字
char tela[12];//电话
char sex[5];//性别
int high;//学号
}p1, p2;//分号不能丢
其中p1和p2是使用struct peo结构类型创建的两个变量,可以也就是p1和p2分别可以放一个人的信息。?但是因为p1和p2放在大括号的外面,所以p1和p2是两个全局的结构体变量。要想使其成为局部变量,我们可以使用下面这种方法创建结构体变量。
struct peo
{
char name[20];//名字
char tela[12];//电话
char sex[5];//性别
int high;//学号
};//分号不能丢?
int main()
{
struct peo p1 = { 0 };//结构体变量的创建
return 0;
}
结构的成员可以是标量、数组、指针,甚至是其他的结构体。
struct peo
{
char name[20];//数组
};
struct st
{
struct peo p;//其他结构体
int num;//标量
float* f = num;//指针
};
根据上面那个例题,我们可以如下初始化:
struct peo
{
char name[20];//名字
char tela[12];//电话
char sex[5];//性别
int high;//学号
};//分号不能丢?
int main()
{
struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建
return 0;
}
结构体成员包含结构体的结构体变量初始化:
我们需要再用一个{ }将结构体中包含的结构体初始化。
操作如下:?
struct peo
{
char name[20];//名字
char tela[12];//年龄
char sex[5];//性别
int high;//学号
};//分号不能丢?
struct st
{
struct peo p;
int num;
};
int main()
{
struct st s = { {"暴龙战士","88888888888","男",250},66 };
return 0;
}
初始化后我们可以按照以下的方法将其打印出来:
struct peo
{
char name[20];//名字
char tela[12];//年龄
char sex[5];//性别
int high;//学号
};//分号不能丢?
struct st
{
struct peo p;
int num;
};
int main()
{
struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建
struct st s = { {"暴龙战士","88888888888","男",250},66 };
printf("%s %s %s %d \n",p1.name,p1.tela,p1.sex,p1.high );
printf("%s %s %s %d %d\n", s.p.name, s.p.tela, s.p.sex, s.p.high, s.num);
return 0;
}
也就是:结构体变量+.+成员变量。?
?
如果是结构体指针访问指向对象的成员:就用? 结构体指针 -> 成员变量? 的形式打印
如果是结构体变量访问成员:就用? 结构体变量?. 成员变量? 的形式打印
具体操作如下:
struct st
{
struct peo p;
int num;
};
void print1(struct peo* sp)
{
printf("%s %s %s %d \n", sp->name, sp->tela, sp->sex, sp->high);
//结构体指针 -> 成员变量
}
void print2(struct peo p)
{
printf("%s %s %s %d \n", p.name, p.tela, p.sex, p.high);
//结构体变量?. 成员变量
}
int main()
{
struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建
struct st s = { {"暴龙战士","88888888888","男",250},66 };
print1(&p1);
print2(p1);
return 0;
}
我们知道形参是实参的临时拷贝,如果使用结构体变量访问成员时形参就会将实参拷贝一份,这样就需要多开辟一块空间,就会结构体过大,参数压栈的系统开销比较大,从而导致性能的下降。
而使用结构体指针访问指向变量的成员时(如上述代码),我们只是将&p1(4个或8个字节)的地址传给sp而已。
结论:结构体传参的时候,要传结构体的地址。