C 结构体
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
相比于数组可以一次的存储更多的不同的数据类型
定义结构
为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct tag {
member-list
member-list
member-list
...
} variable-list ;
tag 是结构体标签。
member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。这其中就可以定义不同类型的数据类型。
variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。
举个栗子🌰:统计我们班的学生报名的活动包括人数,姓名,年龄,性别,活动名称,总共5个种类的数据。
struct statistics
{
char name[];
char sex[];
char activity[];
int age[];
int number[];
} class;
在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。
//此结构体的声明包含了其他的结构体
struct COMPLEX
{
char string[100];
struct SIMPLE a;
};
//此结构体的声明包含了指向自己类型的指针
struct NODE
{
char string[100];
struct NODE *next_node;
};
其实指针的操作在c中真的好灵活
如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示:
struct B; //对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct A
{
struct B *partner; //other members;
};
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
struct A *partner; //other members;
};
这只是一个大概的演示,并没有将其完全的将其写明白,但是基本上结构体中包含另一个结构体的方法就是这样子了,用指针来跳转。
结构体变量的初始化
和其它类型变量一样,对结构体变量可以在定义时指定初始值。
#include <stdio.h>
struct statistics
{
char name[];
char sex[];
char activity[];
int age;
int number;
} class={"拜拜李","男","大胃王比赛",18,21};
int main ()
{
printf("name:%s\nsex:%s\nactivity:%s\nage:%d\nnumber:%d\n",statistics.name,statistics.sex,statistics.activity,statistics.age,statistics.number);
}
将他运行出来的话就是
name: 拜拜李
sex: 男
activity:大胃王比赛
age:18
number:21
访问结构成员
为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。可以使用 struct 关键字来定义结构类型的变量。
上面的也有用到这个句号, strcpy,即string copy(字符串复制)的缩写。strcpy是一种C语言的标准库函数,strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char。*
下面的代码就是演示,
#include <stdio.h>
#include <string.h>
//先声明了结构体Books 结构体,有title ,author ,subject ,book_id 这几种类型
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
struct Books Book1; /* 声明 Book1,类型为 Books */
struct Books Book2; /* 声明 Book2,类型为 Books */
/* Book1 详述 */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* Book2 详述 */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
return 0;
}
结构作为函数参数
可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。
指向结构的指针
可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:
struct Books *struct_pointer;
现在,您可以在上述定义的指针变量中存储结构变量的地址。为了查找结构变量的地址,请把 & 运算符放在结构名称的前面,如下所示:
struct_pointer = &Book1;
为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符,如下所示:
struct_pointer->title;
只整理了一部分,下一篇整理结构体的位域和内存问题,还有内存的优化内容。