8.1.结构体

结构 (重要)

        结构是c语言分配内存的第三大方法

                1.通过定义变量(少量分配)

                2.采用数组(数据类型一致)

                3.结构体

                 (1)结构是一种由若干成员组成的构造类型

                 (2)结构的成员既可以是基本类型的数据,也可以又是数据类型的数据

                 (3)结构是一种构造而成的数据类型,在使用结构之前必须先行定义

                        因此结构也是一种自定义数类型

                 (4)结构类型的数据在存储上类似于数组,所有成员按其被声明的顺序,由低地址到高地址连续(或接近连续)存放

                 (5)与数组不同,结构的成员可以是不同类型的数据,因此结构也是一种复合数据类型。

                6.指向结构变量和结构数组的指针

                结构指针的计算以整个结构的大小为单位

                7.访问结构的成员

                通过结构变量访问其成员,用成员访问运算符“ . ”

                通过结构指针访问其目标的成员,用间接成员访问运算符 “ -> ”

                8.如果函数的参数是结构类型,那形参只是实参的拷贝,在函数内部无法修改实参的成员

                9.如果函数的参数是结构指针,并接受实参的地址,那就可以在函数内部修改实参的成员

                (6)定义方式:

                        1.直接定义结构类型变量(用的很少)

                                struct {

                                        数据类型1 成员1;

                                        数据类型2 成员2;

…………

                                }变量;

                                例如:

                                struct {

                                char name[32];//姓名

                                int age;//年龄

                                }stu1 = {"a",18};

                        其缺点为:

                                每定义一个变量都需要写一次结构体

代码如下:

        1 //结构体定义方法1:直接定义结构体数据类型变量

        2 //切记:结构体的本质就是一种数据类型,是自定义的数据类型,程序员根据需求发明创造的数据类型

        3 //用结构体数据类型分配的内存可以做到数据类型不一致。

//结构体玩法1:直接定义结构体数据类型变量(用的少)
//切记:结构体的本质就是一种数据类型,是自定义数据类型,程序员根据需求发明创造的数据类型
//用结构体数据类型分配的内存可以做到数据类型不一致
#include <stdio.h>
#include <string.h>
int main(void) {
    //直接定义结构体数据类型的变量并且初始化
    struct {
        char name[32]; //存储学生的姓名
        int age; //存储学生的年龄
    }stu1 = {"小白", 18};
    //打印学生信息
    printf("%s, %d\n", stu1.name, stu1.age);
    //修改
    strcpy(stu1.name, "李小白");
    stu1.age++;
    //打印学生信息
    printf("%s, %d\n", stu1.name, stu1.age);
    return 0;
}

2.先声明结构类型(头文件),再用该类型定义变量(源文件)

struct 结构类型名 {

        数据类型1 成员1;

        数据类型2 成员2;

……………

}; //声明

struct 结构类型名 变量;//定义,把struct结构体类型名类比成int类型

例如:

struct student {

        char name[32];

        int age;

};

struct student stu1;//类比成int stu1

        其初始化方式有两种:

                1.struct student stu1 = {"小白",18} 传统初始化,必须元素齐全且必须按照声明的顺序

                2. struct student pstu = {.age = 18, .name = "小白"}; //标记初始化 ,不需要按照顺序,不需要全部初始化

        当初始化指针 struct student * stu2时

                pstu ->age, pstu->name

代码如下:

//结构体数据类型玩法2:先声明一个结构体数据类型(先发明创造一个结构体类型,类似创造一个int)
//然后用该结构体数据类型定义结构体变量来实现内存分配
#include <stdio.h>
#include <string.h>
//声明结构体数据类型来描述学生的基本信息,造一个自己的int一样
struct student {
    char name[32]; //描述姓名
    int age; //描述年龄
};//好比把struct student当成int来看
int main(void) {
    //定义结构体数据类型变量来分配内存存储学生信息
    //struct student stu1 = {"小白", 18}; //传统初始化
    struct student stu1 = {.age = 18, .name = "小白"}; //标记初始化,类比:int stu1 = ...
    struct student *pstu = &stu1; //pstu指向stu1,类比:int *pstu = &stu1;
    printf("%s, %d\n", stu1.name, stu1.age);
    printf("%s, %d\n", pstu->name, pstu->age);
    strcpy(stu1.name, "李小白");
    pstu->age++;
    printf("%s, %d\n", stu1.name, stu1.age);
    printf("%s, %d\n", pstu->name, pstu->age);
    return 0;
}

3.通过typedef定义类型别名,再用该别名定义变量

        typedef int s32 //相当于给int定义别名s32

        typedef struct 结构类型名 {

                数据类型1 成员1;

                数据类型2 成员2;

…………

        } 类型别名;

        类型别名 变量;

        例如:

        typedef struct student { //student名称可以省略

               char name[32];

                int age;

        }stu_t; //当用tpyedef给一个类型取别名是,一般加一个_t 告诉他人这个类型是别名

        stu_t stu1;

代码如下:

//结构体数据类型玩法3:先声明一个结构体数据类型(先发明创造一个结构体类型,类似创造一个int)
//然后给结构体数据类型用typedef取别名,最后用别名定义结构体变量来实现内存分配
#include <stdio.h>
#include <string.h>
//声明结构体数据类型并且取别名来描述学生的基本信息,造一个自己的int一样
typedef struct student {
    char name[32]; //描述姓名
    int age; //描述年龄
}stu_t;//给struct student取别名叫stu_t,好比把stu_t当成int来看
int main(void) {
    //定义结构体数据类型变量来分配内存存储学生信息
    //stu_t stu1 = {"小白", 18}; //传统初始化
    stu_t stu1 = {.age = 18, .name = "小白"}; //标记初始化,类比:int stu1 = ...
    stu_t *pstu = &stu1; //pstu指向stu1,类比:int *pstu = &stu1;
    printf("%s, %d\n", stu1.name, stu1.age);
    printf("%s, %d\n", pstu->name, pstu->age);
    strcpy(stu1.name, "李小白");
    pstu->age++;
    printf("%s, %d\n", stu1.name, stu1.age);
    printf("%s, %d\n", pstu->name, pstu->age);
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值