在这篇文章中我们只讲一些结构体的一些基础的知识,后续会继续补充关于结构体的高阶知识。
1.结构体声明
1.1结构体的基本知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构可以用来描述复杂对象,在生活中有很多对象并不是单一属性的,比如一个人,就有姓名年龄身高体重学校电话等等属性,C语言中的结构体就可以用来描述复杂属性的对象。
1.2结构的声明
struct tag
{member - list;
}variable-list;
上面的代码中,struct是一个结构体关键字,tag是结构的标签、名字。member-list是成员列表,variable-list是指在结构体进行声明时就创建的结构体变量名,在这里创建的结构体变量是全局变量。
结构体声明是不占内存空间的,只有用结构体去创建结构体变量的时候才申请空间。结构体是一种自定义类型。
1.3结构成员的类型
结构成员的类型可以是标量、数组、指针甚至是其他结构体。
struct stu
{char name[20];int age;char sex[5];char tele[20];
};
1.4结构变量的定义和初始化
我们可以在声明的时候定义结构体全局变量,也可以在函数内部定义结构体局部变量;
结构体初始化可以用一个大括号,在大括号里面对成员变量依次赋初值;
结构体嵌套是初始化也是用大括号赋初值,里面的结构体再用一个大括号赋初值。
结构体初始化也可以不完全初始化,比如只对前几个成员变量赋初值。
#include<stdio.h>struct stu
{char name[20];int age;char sex[5];char tele[20];
};
struct school
{struct stu s;char tele[20];char teacher[20];int count_stu;
};
int main()
{struct stu s1 = { "zhangsan",13,"男","111111111111" };struct stu s2 = { "zhangsan",11 };struct school S = { {"zhangsan",13} };struct school S1 = { { "zhangsan",13,"男","111111111111" },"123456789","lisi",500 };return 0;
}
2.结构体成员的访问
在前面操作符详解中我们已经降到了两个操作符的成员访问变量
结构体变量.成员变量;
结构体指针->成员变量;
3.结构体传参
结构体传参也分为传值和传址,当我们要在函数内部修改结构体内部的成员变量时,我们就要传结构体的地址。
在前面的函数栈帧中我们讲到函数传参是要压栈的,当我们结构体内存很大时,压栈就会浪费时间和空间,参数压栈时的系统开销就比较大,导致性能下降,所以我们最好传址调用结构体,节约时间和空间。如果我们不想函数内部修改结构体内的变量时,我们可以在定义函数时用const修饰结构体指针。
void print(struct stu s){printf("%s ", s.name);printf("%d ", s.age);printf("%s ", s.sex);printf("%s\n", s.tele);
}void Print(const struct stu* s)
{printf("%s ", s->name);printf("%d ", s->age);printf("%s ", s->sex);printf("%s\n", s->tele);
}
这篇文章只对结构体做初步认识,深入的知识会在后续C语言专栏中更新。