目录
结构体的声明
1.结构的基础知识
- 结构的概念:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
- 结构的作用:用来描述复杂对象
2.结构的声明
e.g(描述学生的结构)
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[15];//学号
};
3.结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体
4.结构体变量的定义和初始化
-
结构体变量的定义
e.g(1)
struct Stu
{
//学生的相关属性
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[15];//学号
}s1,s2;
s1和s2 是 struct Stu 类型的结构体变量
这里的s1和s2是全局变量
e.g(2)
struct Stu
{
//学生的相关属性
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[15];//学号
};
int main()
{
struct Stu s1;
struct Stu s2;
return 0;
}
s1和s2 也是 struct Stu 类型的结构体变量
这里的s1和s2是局部变量
-
拓展
typedef struct
{
//学生的相关属性
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[15];//学号
}Stu;
int main()
{
Stu s3;
Stu s4;
return 0;
}
这里我们使用 typedef 进行结构类型的重命名,Stu是重命名后结构体类型名
s3和s4是 Stu 类型的结构体变量
-
结构体的初始化及成员打印
1.按照指定顺序初始化及打印
struct Book
{
char book_name[21];
char author[15];
int price;
//...
};
//一个汉字占2个字符
int main()
{
int num=20;
struct Book s1={"老人与海","海明威",30};
struct Book s2={"四世同堂","老舍",20};
printf("%s %s %d\n",s1.book_name,s1.author,s1.price);
//结果:老人与海 海明威 30
struct Book b = { "鹏哥C语言","鹏哥",66 };
struct Book* psb = &b;
printf("%s %s %d\n", psb->book_name,psb->author, psb->price);//结构体指针的形式
//结果为:鹏哥C语言 鹏哥 66
return 0;
}
2.指定成员来初始化及打印
struct Book
{
char book_name[21];
char author[15];
int price;
//...
};
//一个汉字占2个字符
int main()
{
int num = 20;
struct Book s1 = {.book_name="老人与海",.price=30};//未初始化的成员默认初始化为0
printf("%s %s %d\n", s1.book_name, s1.author, s1.price);
//结果:老人与海 30
return 0;
}
结构体的成员访问
1.结构体变量访问成员
- 结构变量的成员是通过点操作符(.)访问的.
e.g
void set_s(struct S* x)
{
(*x).age = 18;
//(*x).name = "zhangsan"; error
//name是数组名(地址),也就是一个常量,常量不可以更改
strcpy((*x).name, "zhangsan");//将"zhangsan"这个字符串拷贝到(*x).name那块空间里去
}
int main()
{
struct S s = { 0 };
//写一个函数给s中存放数据
set_s(&s);
return 0;
}
2.结构体指针访问指向变量的成员
- 结构体指针访问指向变量的成员是通过箭头操作符(->)访问的。
e.g
void set_s(struct S* x)
{
x->age = 18;
strcpy(x->name, "zhangsna");
}
int main()
{
struct S s = { 0 };
//写一个函数给s中存放数据
set_s(&s);
return 0;
}
结构体传参
struct S
{
char name[20];
int age;
};
struct S
{
int data[1000];
int num;
};
struct S s = { {1,2,3,4}, 1000 };
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
return 0;
}
上述代码我们首选 print2函数,因为函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。