结构体(struct)在C语言中用于处理多个单一数据组成的数据集合。在复杂的数据处理中,结构体是必不可少的。
1. 结构体声明
struct 结构体名{
数据类型1 结构体成员1;
数据类型2 结构体成员2;
.....
};
eg :
struct Student {
char name[20];
int age;
char sex[3];
char id[20];
};//分号不能丢
这这个结构体包含了4个元素,数据类型名为 struct Student ,而不是Student。
2. 定义结构体变量
声明了结构体类型后便可以使用结构类型定义结构体变量。
(1)声明结构体类型,并定义结构体变量
eg :
struct Student {
char name [];
int age;
char gender;
char num[];
};
struct Student s; // 定义结构体变量s
(2) 不声明结构体类型,直接定义结构体变量
eg :
struct {
char name [];
int age;
char gender;
char num[];
} S; // 定义了结构体变量 s
这种形式并没有结构体数据类型,因此无法向第一种形式那样再其他语句中多次定义结构体变量。如果要声明另一个同一类型的结构体变量,必须将这个结构体的内容全部写上。
(3)使用 typedef得到简化的结构体类型名,再定义结构体变量。
typedef struct Student {
char name [];
int age;
char gender;
char num[];
} Student; // 定义了结构体变量
这样可以像其他数据类型一样定义变量。
3. 结构体成员访问
使用成员访问操作符(.)访问结构体成员。. 是二元操作符。
eg :
Student . name;
Student . age;
Student . sex;
使用实例:
/* 结构体的使用 */
#include <stdio.h>
#define SIZE_NAME 30
typedef struct _per_infor {
char name[SIZE_NAME];
int age;
char gender;
} per_infor;
int main(void) {
per_infor raul;
per_infor joe;
printf("Please input Raul's information:\n");
gets(raul.name);
scanf("%d %c", &raul.age, &raul.gender); /* .优先级比&高 */
printf("raul.name\t= %s\n", raul.name);
printf("raul.age\t= %d\n", raul.age);
printf("raul.gender\t= %c\n", raul.gender);
joe.age = 31;
printf("joe.name\t= %s\n", joe.name);
printf("joe.age\t\t= %d\n", joe.age);
printf("joe.gender\t= %c\n", joe.gender);
return 0;
}
4. 结构体数组
结构体数组表示每个人数组元素都是一个结构体类型的数据,它们都分贝包括各个成员项。
定义结构体类型:
struct 结构体名
{
成员列表
} 数组名 [数组长度];
声明结构体
结构体类型 数组名 [数组长度];
eg : 有三个候选人,每个选民只能投票一人,要求编辑一个统计选票的程序,先后输入被选人的姓名,最后输出各个人的得票结果。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Person
{
char name[20];
int count;
}leader[3] = {"li",0,"wang",0,"zhao",0};
int main(){
int i, j;
char leader_name[10];
for (i = 0; i < 10; i++) {
scanf("%s", leader_name);
for (j = 0; j < 3; j++) {
if (strcmp(leader_name, leader[j].name) == 0) {
leader[j].count++;
}
}
}
printf("结果\n");
for (i = 0; i < 3; i++) {
printf("%s: %d \n", leader[i].name, leader[i].count);
}
return 0;
}
运行结果:
li li li li li zhao zhao zhao wang zhao
结果
li: 5
wang: 1
zhao: 4
请按任意键继续. . .
5. 结构体指针
定义: 指向结构体变量的指针。
struct Student * p;
(*)p. num; 等价于 p -> num;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
int num;
char name[10];
char sex;
float score;
};
int main() {
struct Student stu;
struct Student *p;
p = &stu;
stu.num = 1010;
strcpy(stu.name, "Lilin");
stu.sex = 'M';
stu.score = 89.5;
printf("num:%d name:%s sex:%c score:%f \n",
p->num, p->name, p->sex, p->score); // 使用指针访问结构体内容并打印
return 0;
}
运行结果:
num:1010 name:Lilin sex:M score:89.500000
请按任意键继续. . .
另; 如果 p 指向一个结构体变量 stu, 一下三种方式等价:
(1)stu. 成员名;
(2)(*p). 成员名;
(3)p -> 成员名;