结构体的定义
struct Student{ //struct Student就是结构体名
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}
定义方式:
struct 结构体名{ 成员列表 }; //成员列表也被称为域表
定义结构体变量
(a)先声明,后定义变量
struct Student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}
struct Student student1,student2;
定义结构体变量后,系统会为它分配内存单元。根据结构类型中成员列表的情况,相加后就是结构体变量的字节大小。分配的内存是连续的。
&student1=&student1.num;
&student1.name=&student1.num加上四个字节地址;
(b)声明的同时定义变量
struct 结构体名{成员列表} 变量名列表;
struct Student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}student1,student2;
结构体变量初始化和引用
(a)定义变量时初始化
struct Student{
int num;
char name[20];
char sex;
}student1={0,”bbbb”,'g',23};
或者
struct Student{
int num;
char name[20];
char sex;
};
struct Student student1={0,”bbbb”,'g',23};
C99中允许对某一个成员初始化:
struct Student student1={.name=”bbbbb”};
没有初始化的数值为0,字符为’\0’,指针为NULL。
(b)引用结构体变量成员名
结构体变量名.成员=值
若结构体中的成员本身是一个结构体,则可以用.递进引用最底层成员。
student.birthday.month
通过引用可以给成员变量赋值和运算。
(c)结构体变量可以互相赋值
struct Student student1={0,”bbbb”,'g','23'};
struct Student student2;
student2=student1;
结构体数组和指针
(a)定义结构体数组
struct Student{ //14个字节
int num;
char name[10];
}stus[3]={0,”aaa”,1,”bbb”,2,”ccc”};
(b)指向结构体变量的指针
其实在定义一个结构体类型后,这个结构体类型就成了一个类似于int、char等的类型。
Struct Student就是类型名。
因此指针可以定义为:
struct Student *pointer_s;
pointer_s=&student1;
但是在引用时需要注意,由于.(点号)是所有操作符中运算优先级最高的,因此访问时应该:
(*pointer_s).num;
在c语言中,(*pointer).等价于pointer->。
(*pointer_s).num == pointer_s->num
(c)用指针指向数组
struct Student *p=stus;
(++p)->num; //先加1,再指向num