结构体
1. 结构体类型的声明
2. 结构体初始化
3. 结构体成员访问
4. 结构体传参
结构的基础知识:
结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量
描述一个学生结构体类型 struct是结构体关键字
描述一个学生一些数据
名字
年龄
电话
性别
结构体类型定义方法一
//struct 结构体关键字 Stu结构体标签 struct Stu -结构体类型
struct Stu //这是在定义结构体类型
{
//成员变量
char name[20];
short age;
char tele[20];
char sex[5];
}s1,s2,s3;//s1,s2,s3是3个全局的结构体变量
//因为是结构体的声明,所以是语句,结尾要加分号
结构体类型定义方法二
typedef struct Stu //这是在定义结构体类型
{
//成员变量
char name[20];
short age;
char tele[20];
char sex[5];
}Stuu; //typedef就是对struct Stu 重新起了一个名字叫做Stuu 这里Stuu是类型
初始化结构体
int main()
{
Stuu s1 = {
"张三",20,"1232311234","男"};//s1局部变量 结构体初始化
struct Stu s2 = {
"旺财",30,"1234132423","保密"};//结构体初始化
return 0;
}
嵌套结构体初始化
结构体里面包含结构体
struct S
{
int a;
char c;
char arr[20];
double d;
};
struct T
{
char ch[10];
struct S s;
char *pc;
};
int main()
{
char arr[] = "hello bit\n";
struct T t = {
"hehe", {
10,'w',"hello world",3.14},arr };
printf("%s\n", t.ch);//hehe
printf("%d\n", t.s.a);//10
printf("%c\n", t.s.c);//w
printf("%s\n", t.s.arr);//helloworld
printf("%lf\n", t.s.d);//3.14
printf("%s\n", t.pc);//hello bit
return 0;
}
结构体成员的访问是通过点操作符(.)访问的,点操作符接受两个操作数
结构体传参的两种方法
下面首先完整代码,分别代码在最后
typedef struct Stu
{
//成员变量
char name[20];
short age;
char tele[12];
char sex[5];
}Stuu;
void print1(Stuu tmp)
{
printf("name: %s\n", tmp.name);
printf("age: %d\n", tmp.age);
printf("telt: %s\n", tmp.tele);
printf("sex: %s\n", tmp.sex);
}
void print2(Stuu* ps)
{
printf("name:%s\n", ps->name);
printf("age: %d\n", ps->age);
printf("telt:%s\n", ps->tele);
printf("sex: %s\n", ps->sex);
//ps->意思是ps所指向对象的成员
//ps->age意思是ps所指向对象的年龄
}
int main()
{
Stuu s = {
"张三",20,"12345678912","男"};
//打印结构体数据
//print1和print2 那个更好?
//答案是:首选print2h函数原因:
//函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大
//参数压栈的系统开销比较大,所以会导致性能的下降
//结论是:结构体传参的时候,要传结构体的地址首选print2
//压栈操作
print1(s);
print2(&s);
return 0;
}
方法一 传进来的是整个结构体数据 s
我们尽量不要用上面这种方法
void print1(Stuu tmp)
{
printf("name: %s\n", tmp.name);
printf("age: %d\n", tmp.age);
printf("telt: %s\n", tmp.tele);
printf("sex: %s\n", tmp.sex);
}
方法二 传进来是整个结构体数据的地址&s
我们推荐使用这种方法
void print2(Stuu* ps)
{
printf("name:%s\n", ps->name);
printf("age: %d\n", ps->age);
printf("telt:%s\n", ps->tele);
printf("sex: %s\n", ps->sex);
}
打印结构体数据
print1和print2 那个更好?
答案是:首选print2h函数原因:
函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大参数压栈的系统开销比较大,所以会导致性能的下降
结论是:结构体传参的时候,要传结构体的地址首选print2