黑马程序员--C语言基础之--结构体详解
------IOS培训期待与您交流! -------
在实际应用中,某个对象由不同类型的数据组成,比如学生的姓名为字符串型,学号可为整形或者字符串型,性别为枚举类型,身高为浮点型。
很显然,不可能用一个数组来存放这些数据。C语言用一种构造数据类型——结构体来表示这个对象。
一、定义结构体变量
结构体和枚举一样,需要先定义结构体,再定义结构体变量。
1、定义结构体:struct是结构体的关键字,定义一个结构体的一般形式为:
/* struct 结构体名{ 数据类型1 成员名1; 数据类型2 成员名3; ...... 数据类型n 成员名n; }; */ struct Student {
char *name; // 姓名
int age; // 年龄
float height; // 身高
};
2、定义结构体变量
定义好结构体之后,就可以定义结构体变量。常见的3种定义结构体变量方式:
(1) 先定义结构体类型,再定义变量
(2) 定义结构体类型的同时定义变量
(3) 直接定义结构体类型变量,省略类型名
/* struct Student {
char *name; // 姓名
int age; // 年龄
float height; // 身高
};
struct Student stu; //第一种方式 //第二种方式 struct Student {
char *name; // 姓名
int age; // 年龄
float height; // 身高
} stu; //第三种方式 struct {
char *name; // 姓名
int age; // 年龄
float height; // 身高
} stu;
二、定义结构体的注意事项
(1) 结构体内部的数据类型不能是该结构体本身,即不能递归定义
(2) 结构体内部的数据类型可以是已经定义好的结构体
(3) 定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样。只有当定义属于结构体类型的变量时,
系统才会分配存储空间给该变量
(4) 结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列
/* struct Student { char *name; // 姓名 int age; // 年龄 float height; // 身高 Student stu; // 结构体内部的数据类型不能是该结构体本身 }; */ struct Date { int year; int month; int day; }; struct Student {
char *name; // 姓名
int age; // 年龄
float height; // 身高
Date birthday; //结构体内部的数据类型可以是已经定义好的结构体
}; //此时并没有分配存储空间 struct Student stu; //给变量stu分配存储空间 struct { char *name; // 姓名
int age; // 年龄
float height; // 身高
} stu; //stu占用的内存空间,4 + 4 + 4 = 12
三、 结构体变量的初始化
初始化结构体变量有两种发法:
(1) 将各成员的初值,按顺序地放在一对大括号{}中,并用逗号分隔,一一对应赋值。
(2) 在大括号内,将点和成员名组合在一起,并赋值,成员名的顺序是任意的。
要注意的是,只能在定义变量的同时进行初始化赋值,初始化赋值和变量的定义不能分开。
struct Student {
char *name; // 姓名
int age; // 年龄
float height; // 身高 }; struct Student stu = {"zhangsan",12,165.7f}; //第一种方法初始化
struct Student stu1 = {.age = 12,.name = "zhangsan"}; //第二种方法初始化 /*错误的初始化 struct Student stu;
stu = {"zhangsan",12,165.7f}; */
四、访问结构体变量的成员
(1) 一般对结构体变量的操作是以成员为单位进行的,引用的一般形式为:结构体变量名.成员名。
(2) 如果某个成员也是结构体变量,可以连续使用成员运算符"."访问最低一级成员。
(3) 相同类型的结构体变量之间可以进行整体赋值。
struct Date { int year; int month; int day; }; struct Student {
char *name; // 姓名
int age; // 年龄
float height; // 身高
Date birthday;
}; struct Student stu; //给变量stu分配存储空间 stu.age = 17; //给成员变量赋值
stu.birthday.year = 2000; //给结构体成员的成员赋值 struct Student stu1 = stu; //将stu直接赋值给stu1
五、结构体数组
(1) 定义结构体数组变量和定义结构体变量一样,有三种方式。初始化也和结构体变量一样。
(2) 结构体数组的访问方式和数组一样。
struct Date { int year; int month; int day; } date[3]; //定义结构体数组变量 struct Student {
char *name; // 姓名
int age; // 年龄
float height; // 身高 };
struct Student stu[2] = {{"zhangsan",14,123.6f},{.name = "lisi",.age = 12}}; //定义结构体数组变量,并初始化 struct {
char *name; // 姓名
int age; // 年龄
float height; // 身高
} stus[3]; //定义结构体数组变量
stus[0].age = 12; //给结构体数组成员赋值
六、指向结构体的指针
(1) 结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量。
(2) 结构体指针变量的定义形式:struct 结构体名称 *指针变量名。
(3) 结构体指针访问结构体成员的方法:
第一种:(*指针变量名).成员名
第二种:指针变量名->成员名
struct Date { int year; int month; int day; } ; //定义结构体数组变量 struct Date date = {2001,12,12}; struct Date *p = &date; (*p).year = 1990; //第一种方式,给结构体赋值
p->month = 11; //第二种方式,给结构体赋值