结构体:
有时需要将不同类型的数据组合成一个人有机的整体,以便于引用。
如:一个学生有学号/姓名/性别/年龄/地址等属性 int num; char name[20]; char sex; int age;char addr[30]。
定义一个结构体的一般形式为:
struct 结构名
{
成员列表(其形式为:类型说明符 成员名; 由若干个成员组成)
};
例如:
struct student
{
int num;
char name[20];
char sex;
int age;
char addr[30]
};
定义结构体变量的方法:
1、先声明结构体类型在定义变量名。
例如:struct student student1,student2;
类型名 结构体 变量名 变量名
定义了student1和student2为struct student类型的变量,即它们具有struct student类型的结构。
在定义了结构体变量后,,系统会为之分配内存单元。student1和student2在内存中各占(4+20+1+4+30=63)个字节。
2、在声明类型的同时定义变量。
struct (结构体名)
{
成员表列
}变量名表列;
下面有这么一个表列,并定义两个结构体变量,应该怎么定义?
首先定义一个结构date,由month,day,year三个成员组成。在定义并说明变量boy1和boy2时,其中的成员birthday被说明为data结构类型。成员名可与程序张其他变量同名,互不干扰。
struct date
{
int month;
int day;
int year;
};
struct
{
int num;
char name[20];
char sex;
struct date birthday;
float score;
}boy1,boy2;
结构体变量的引用:
1、不能将一个结构体变量作为一个整体进行输入和输出。引用结构体变量中成员的方式为:结构体变量名.成员名
student1.num表示student1变量中的num成员,即student1的num项。可以对变量的成员赋值,例如:student1.num=100;
“.”是成员(分量)运算符,它在所有的运算符中优先级最高,因此可以把student1.num作为一个整体来看待。上面的赋值语句的作用是将整数100赋给student1变量中的成员num。
#include<stdio.h>
int main()
{
struct student
{
int num;
char *name;
char sex;
double score;
}boy1,boy2;
boy1.num=007;
boy1.name="Jane";
printf("Please input sex and score\n");
scanf("%c%lf",&boy1.sex,&boy1.score);
boy2=boy1; //这里boy1中的全体成员的值都赋给了boy2
printf("Number = %d\nName = %s\n",boy2.num,boy2.name);
printf("Sex = %c\nScore = %lf\n",boy2.sex,boy2.score);
}
2、如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级的找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。
3、对结构体变量的成员可以像普通变量一样进行各种运算。
4、可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
#include<stdio.h>
int main()
{
struct student
{
int num;
char *name;
char sex;
double score;
}boy1;
boy1.num=007;
boy1.name="Jane";
printf("The address of struct is %o :\n",&boy1);
printf("The address of num is %o :\n",&boy1.num);
}
但是不能用一下语句整体读入结构体变量:
结构体变量的地址主要用作函数参数,传递结构体变量的地址。
结构体变量的初始化:
#include<stdio.h>
int main()
{
struct student
{
int num;
char *name;
char sex;
double score;
}boy1,boy2={102,"Jane",'M',98.5};
boy1=boy2;
printf("Number = %d\nName = %s\nScore = %lf\n\n",boy1.num,boy1.name,boy1.score);
printf("Number = %d\nName = %s\nScore = %lf\n",boy2.num,boy2.name,boy2.score);
}
结构体数组:
每个数组的元素都是一个结构体类型的数据,它们都分别包括各个成员项。
例题:通讯录
#include<stdio.h>
#include<stdlib.h>
#define NUM 3
struct person
{
char name[20];
char phone[20];
};
int main()
{
struct person man[NUM];
int i;
for(i=0;i<NUM;i++)
{
printf("Input name:\n");
gets(man[i].name);
printf("input phone:\n");
gets(man[i].phone);
}
printf("\tname\t\t\t\tphone\n\n");
for(i=0;i<NUM;i++)
{
printf("%18s\t\t%18s\n",man[i].name,man[i].phone);
}
system("pause");
}
定义结构体数组:
struct student student[3];
也可以这样:
struct student
{
int num;
char name[20];
char sex;
int age;
char addr[30]
}student[3];
结构体数组初始化:
例如:
struct student
{
int num;
char name[20];
char sex;
int age;
char addr[30]
}stu[2]={
{101,"lilin",'M',18,87.5,"beijing"},
{102,"zhang",'F',19,99,"shanghai"}
};
也可以分开,即声明结构体类型,然后定义数组为该结构体类型,在定义数组时初始化。
指向结构体类型数据的指针:
一个结构体变量的指针就是该结构体变量所占据的内存段的起始地址。
指针变量也可以用来指向结构体数组中的元素。
结构体指针变量说明的一般形式为:
struct 结构名 *结构指针变量名
赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。
如果定义指针变量pstu,boy是被说明为stu类型的结构变量,则:
pstu=&boy;
是正确的
pstu=&stu;
是错误的。
因为结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。
其访问的一般形式为:
(*结构指针变量).成员名
或为:
结构指针变量->成员名
举个栗子:
#include<stdio.h>
int main()
{
struct stu
{
int num;
char *name;
char sex;
double score;
}boy1={102,"Jane",'M',98.5};
struct stu *pstu;
pstu=&boy1;
printf("Number = %d\nName = %s\n",boy1.num,boy1.name);
printf("Sex = %c\nScore = %lf\n\n",boy1.sex,boy1.score);
printf("Number = %d\nName = %s\n",(*pstu).num,(*pstu).name);
printf("Sex = %c\nScore = %lf\n\n",(*pstu).sex,(*pstu).score);
printf("Number = %d\nName = %s\n",pstu->num,pstu->name);
printf("Sex = %c\nScore = %lf\n\n",pstu->sex,pstu->score);
}