在前面,我们已经学习了数组。数组可以存储相同类型的数据变量,但是,有时,一个数据可能包含不同的数据类型,针对这一问题,提出结构体。结构体可以存储相同的数据类型。
struct tag { //结构体标签
member-list
member-list
member-list
...
} variable-list ;//结构体变量
上述三个标签至少出现两个
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct
{
int a;
char b;
double c;
} s1;
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct SIMPLE
{
int a;
char b;
double c;
};
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
//也可以用typedef创建新类型
typedef struct
{
int a;
char b;
double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
//此结构体的声明包含了其他的结构体
struct COMPLEX
{
char string[100];
struct SIMPLE 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"
#include "string.h"
/*
此处在定义结构体的时候直接进行了结构体变量的初始化
*/
struct people
{
char name[20];
int age;
}student = {"xiaomage",23};
int main(){
printf("name:%s\nage:%d\n****更改后*****\n",student.name,student.age);
// 访问结构体变量,对其进行更改
strcpy(student.name,"xiaoma");
student.age = 22;
printf("name:%s\nage:%d\n",student.name,student.age);
}
name:xiaomage
age:23
****更改后*****
name:xiaoma
age:22
#include "stdio.h"
#include "string.h"
// 定义结构体
struct People
{
char name[20];
int age;
};
int main()
{
// 定义结构变量
struct People people;
strcpy(people.name, "xiaomage");
people.age = 23;
// 结构变量指针声明
struct People *p;
p = &people;
// ->:表示访问地址所存放的变量
printf("name:%s\nage:%d\n", p->name, p->age);
return 0;
}
name:xiaomage
age:23