C语言结构体

在实际应用中,某个对象由不同类型的数据组成,比如学生的姓名为字符串型,学号可为整形或者字符串型,性别为枚举类型,身高为浮点型。很显然,不可能用一个数组来存放这些数据。C语言用一种构造数据类型——结构体来表示这个对象。
1    定义结构体变量
结构体和枚举一样,需要先定义结构体,再定义结构体变量。
1.1    定义结构体
struct是结构体的关键字,定义一个结构体的一般形式为:

/*
struct 结构体名{
数据类型1 成员名1;
数据类型2 成员名3;
......
数据类型n 成员名n;
};
*/

struct Student {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高
};

1.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;

2    定义结构体的注意事项
(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

3    结构体变量的初始化
初始化结构体变量有两种发法:
(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};
*/

4    访问结构体变量的成员
(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

5    结构体数组
(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;  //给结构体数组成员赋值

6    指向结构体的指针
(1) 结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量。
(2) 结构体指针变量的定义形式:struct 结构体名称 *指针变量名。
(3) 结构体指针访问结构体成员的方法:
1. (*指针变量名).成员名
2. 指针变量名->成员名

 

struct Date {
    int year;
    int month;
    int day;
} ;  //定义结构体数组变量

struct Date date = {2001,12,12};

struct Date *p = &date;

(*p).year = 1990;   //第一种方式,给结构体赋值
p->month = 11;   //第二种方式,给结构体赋值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值