结构体是c语言中的一个特别重要的知识点,本篇是对结构体的一个大体介绍,重点讲解结构体的主体框架,希望看完本篇能够让各位对结构体有一个基本的认识!
前面我们已经学过了使用char
、int
、double
……描述简单对象,但是当我们面对像书、人这样的复杂类型的对象时我们又该用什么描述呢?答案是:结构体
。
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
结构是一些值的集合,这些值称为成员变量。不同于数组,结构的每个成员可以是不同类型的变量。结构的成员可以是标量、数组、指针,甚至是其他结构体。
例如:用结构定义一个学生类型Stu
//学生
//名字+年龄+性别+身高
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
int hight;//身高
}s1,s2,s3;//全局变量
struct Stu s4;//全局变量
int main()
{
struct Stu s5;//局部变量
//通常情况下定义局部变量
return 0;
}
实例展示:
//坐标类型
struct Point
{
int x;
int y;
};
//学生类型
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
int hight;//身高
};
int main()
{
//结构体初始化
struct Point p = { 10,20 };
struct Stu s = { "张三",20,"男",180 };
//结构体成员访问 点操作符
printf("x = % d y = % d\n", p.x, p.y);
printf("%s %d %s %d\n", s.name, s.age, s.sex, s.hight);
//结构体成员访问 ->操作符
struct Point* ps = &p;
struct Stu* pt = &s;
printf("x = % d y = % d\n", ps->x, ps->y);
printf("%s %d %s %d\n", pt->name, pt->age, pt->sex, pt->hight);
return 0;
}
注意:访问结构体成员有两种方式。结构体变量.结构体成员名;结构体指针->结构体成员名
实例展示:
struct Point
{
int x;
int y;
};
struct S
{
char c;
struct Point p;
double d;
char str[];
};
int main()
{
//结构体初始化
//struct S ss = {.d=3.14, .c = 'x', .p.x =100};//乱序初始化某些成员//
struct S ss = { 'x',{100,200},3.14,"哈哈"};
//结构体成员访问 点操作符
printf("%c %d %d %lf %s\n",ss.c,ss.p.x,ss.p.y,ss.d,ss.str);
return 0;
}
注意:结构体的初始化通常在创建结构体变量时进行,并且支持乱序初始化某些成员。
实例展示:
struct S
{
char name[20];
int age;
};
int main()
{
struct S s = { .age = 20, .name = "zhansgan" };
printf("%s %d\n", s.name, s.age);
s.age = 30;//这个可以
//s.name = "zhangsanfeng";//err
strcpy(s.name, "zhsangsanfeng");//对字符串修改只能strcpy
printf("%s %d\n", s.name, s.age);
return 0;
}
注意:对字符串修改只能strcpy,切忌使用赋值操作符。
实例展示:
struct S
{
int data[1000];
char buf[100];
};
void print1(struct S ss)//参数是结构体类型
{
int i = 0;
for (i = 0; i < 10; i++)//打印前十个元素
{
printf("%d ", ss.data[i]);
}
printf("%s\n", ss.buf);
}
int main()
{
struct S s = { {1,2,3} , "hehe"};
print1(s);//传值调用
return 0;
}
实例展示:
struct S
{
int data[1000];
char buf[100];
};
void print2(struct S* ps)//参数是结构体指针类型
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", ps->data[i]);
}
printf("%s\n", ps->buf);
}
int main()
{
struct S s = { {1,2,3} , "hehe"};
print2(&s);//传址调用
return 0;
}
结论:
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。如果传递结构体地址,地址占用内存很小,时间空间都会节省,程序效率会更高。因此结构体传参的时候,要传结构体的地址。
本章篇幅不长,但是对于入门结构体也是特别重要。希望看完本篇能够给各位小伙伴们带来帮助,老铁们保持coding,我们下期再见!