黑马程序员--C语言基础之--结构体详解

在实际应用中,某个对象由不同类型的数据组成,比如学生的姓名为字符串型,学号可为整形或者字符串型,性别为枚举类型,身高为浮点型。

很显然,不可能用一个数组来存放这些数据。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; //第二种方式,给结构体赋值

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。