一、结构定义
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
二、定义结构
作用:使用struct定义一个包含多个成员的新的数据类型
语法格式:
struct tag {
member-list
member-list
member-list
...
} variable-list ;
说明:
(1)tag 是结构体标签。
(2)member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
(3)variable-list 结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量。
拓展:在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。
//此声明声明了拥有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 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 Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};
int main()
{
printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
}
以上就可以完成一个简单的结构体初始化的过程。也可以使用typedef指定结构体类型,再main函数中使用结构体类型并赋初值输出。
四、访问结构体成员
访问符号的使用:使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。
测试该访问运算符对结构体成员变量的访问
#include <stdio.h>
#include <string.h>
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
struct Books Book1; /* 声明 Book1,类型为 Books */
/* Book1 详述 */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* 输出 Book1 信息 */
printf( "Book 1 title : %s\n", Book1.title);
printf( "Book 1 author : %s\n", Book1.author);
printf( "Book 1 subject : %s\n", Book1.subject);
printf( "Book 1 book_id : %d\n", Book1.book_id);
return 0;
}
五、结构作为函数参数
思路:把结构作为函数参数,传参方式与其他类型的变量或指针类似。
实例:定义存放有学生信息(姓名、学号、单科成绩、平均成绩)的结构体,并定义形参类型为结构体类型的函数,求出某个学生的成绩的平均成绩以及最大值,输出该学生的信息。
代码如下:
#include "stdio.h"
struct Student
{int num;
char name[20];
float score[3];
float aver;
}a[3]={{10010,"Jake",{78,89,90},0},{10011,"Angela",{77,78,79},0},{10012,"Smith",{76,75,78},0}};
void main()
{
void average(struct Student a[],int n);
int max(struct Student a[],int n);
void output(struct Student a);
average(a,3);
output(a[(max(a,3))]);
}
void average(struct Student a[],int n)
{
int i;
for(i=0;i<n;i++)
{
a[i].aver=(a[i].score[0]+a[i].score[1]+a[i].score[2])/3.0;
}
}
int max(struct Student a[],int n)
{
int i,j=0;
for(i=0;i<n;i++)
{
if(a[i].aver>a[j].aver)
j=i;
}
return j;
}
void output(struct Student a)
{
printf("成绩最高的学生信息如下:\n");
printf("序号:%d\n名字:%s\n三门科成绩:%4.2f,%4.2f,%4.2f\n平均成绩:%5.2f\n",
a.num,a.name,a.score[0],a.score[1],a.score[2],a.aver);
}
补充说明:结构体作为函数参数的形参类型也可以用指针类型,具体代码和上面的一样。
六、指向结构的指针
(1)定义指向结构的指针,方式与定义指向其他类型变量的指针相似
例如: struct Books *books;
(2)定义的指针变量中可以存储结构变量的地址
例如:books=&pointer ;
(3)想指向该结构的指针访问结构的成员,必须使用 -> 运算符
例如:
books->title;
例:使用指针方法输出成员信息。
#include "stdio.h"
struct Student
{
float score;
char name[20];
int num;
char sex;
}stu[3]={{91,"John",10010,'M'},{92,"Mike",10011,'M'},{93,"Marry",10012,'W'}};
void main()
{struct Student *p;
printf("score Name No. sex\n");
for(p=stu;p<stu+3;p++)
{
printf("%4.2f %5s %4d %2c\n",p->score,p->name,p->num,p->sex);
}
}
注意:在引入指针时,最后不论输出数组还是结构体成员变量的值,都要指明指针指向的首地址是什么。注意区分开使用指针输入输出值的不同方式。