结构是 C 编程中另一种用户自定义的可用的数据类型,用来存储不同类型的数据项。
定义结构
使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct tag {
int a;
float b;
char c;
...
} var;
tag 是结构体标签。
大括号内是变量定义。
var结构变量,定义在结构的末尾,最后一个分号之前。
在一般情况下,tag、变量定义、var 这 3 部分至少要出现 2 个。以下为实例:
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct
{
int a;
char b;
double c;
} s1;
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为Tag,没有声明变量
struct TAG
{
int a;
char b;
double c;
};
//用TAG标签的结构体,另外声明了变量t1、t2、t3
struct TAG t1, t2[20], *t3;
//也可以用typedef创建新类型
typedef struct
{
int a;
char b;
double c;
} Tag2;
//现在可以用Tag2作为类型声明新的结构体变量
Tag2 u1, u2[20], *u3;
在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令 t3=&s1,则是非法的。
//此结构体的声明包含了其他的结构体
struct COMPLEX
{
char string[100];
struct TAG a;
};
//此结构体的声明包含了指向自己类型的指针
struct NODE
{
char string[100];
struct NODE *next_node;
};
如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明
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 Person
{
char name[10];
int age;
char sex[1];
} man= {"hhh", 20, "m"};
int main()
{
printf("name: %s\nage: %d\nsex: %s\n", man.name, man.age, man.sex);
}
访问结构成员
为了访问结构的成员,使用成员访问运算符(.)。
#include <stdio.h>
#include"string.h"
struct Person
{
char name[10];
int age;
char sex[5];
};
int main()
{
struct Person man;
struct Person woman;
strcpy(man.name, "xm");
strcpy(man.sex, "man");
man.age = 20;
strcpy(woman.name, "xh");
strcpy(woman.sex, "woman");
woman.age = 21;
printf("name: %s\nage: %d\nsex: %s\n", man.name, man.age, man.sex);
printf("name: %s\nage: %d\nsex: %s\n", woman.name, woman.age, woman.sex);
}