C语言之结构体

最近在做一个项目时翻看了结构体的知识,感觉当时只是大概地知道它的使用方法,但是更深层次的地方没有去思考,今天这篇文章是关于我对结构体的一些见解,欢迎大家来共同讨论。

首先我们为什么需要结构体呢?

C 语言内置的数据类型,除了几种原始的基本数据类型,只有数组属于复合类型,可以同时包含多个值,但是只能包含相同类型的数据,实际使用场景受限。比如隔壁老王养了两只小猫,一只名字叫小黄,今年2岁,橘色;另一只叫小黑,今年3岁,黑色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示老王没有这只猫。

传统的办法是使用数组,但它是一组具有相同类型的数据的集合。而在这个例子中还需要一组类型不同的数据,如:猫的名字使用字符串、年龄是int,颜色是字符串,因为数据类型不同,因此不能用一个数组来存放。 

那么怎么解决呢?这就出现了结构体的概念。C语言提供了struct关键字,允许自定义复合数据类型,将不同类型的值组合在一起,这种类型称为结构体(structure)类型。C语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能

构建一个结构体类型的一般形式为:

struct 结构体名
{ 
    数据类型1 成员名1;   
    数据类型2 成员名2; 
    ……
    数据类型n 成员名n;
};

比如,定义一个学生的相关信息:

// 定义结构体:学生
struct Student
{
    int id;           // 学号
    int age;          // 年龄
    char *name;       // 姓名
    char gender;      // 性别
    char *address;    // 家庭住址
};

 声明结构体变量

有三种方式

方式1 先定义结构体,然后再创建结构体变量

方式2 在定义结构体的同时定义结构体变量

方式3 在定义时也可以不给出结构体名

注意:在C语言中,结构体(struct)和结构体变量是两个不同的概念。

结构体是一种自定义的数据类型,像一种模板,定义了数据的格式。

结构体变量是根据结构体类型创建的变量,代表了一个具体的对象,用于存储数据。

 结构体元素的获取和赋值

成员是结构体的一个组成部分,一般是基本数据类型、也可以是数组、指针、结构体等。结构体的成员也可以称为属性。

结构体和数组类似,也是一组数据的集合,结构体使用点号 . 获取单个成员,可以进行赋值和取值。可以采用单个逐次赋值和大括号一次性赋值两种方式。

一次性赋值的示例代码如下:

#include <stdio.h>

int main()
{
    // 声明结构体以及结构体变量,并给结构体成员赋值
    struct Student
    {
        int id;        // 学号
        int age;       // 年龄
        char *name;    // 姓名
        char gender;   // 性别
        char *address; // 家庭住址
    } stu1 = {1002, 19, "Jim Liu", 'f', "Songjiang Shanghai"}, stu2 = {1003, 16, "Tom Chen", 'm', "Baoan Shenzhen"};

    // 获取成员的值
    printf("id: %d \n", stu1.id);
    printf("name: %s \n", stu1.name);
    printf("age: %d \n", stu1.age);
    printf("gender: %c \n", stu1.gender);
    printf("address: %s \n \n", stu1.address);

    printf("id: %d \n", stu2.id);
    printf("name: %s \n", stu2.name);
    printf("age: %d \n", stu2.age);
    printf("gender: %c \n", stu2.gender);
    printf("address: %s \n", stu2.address);

    return 0;
}

 结构体指针

结构体指针是指向结构体的指针变量,允许间接访问和操作结构体的成员,它提供了一种方便的方式来处理结构体数据。

声明结构体指针的语法格式:

struct 结构体名 *结构体指针变量名;

通常先定义一个结构体变量,再创建结构体指针,并取结构体变量的地址作为结构体指针的值。

// 声明结构体
struct Student
{
    int id;        // 学号
    int age;       // 年龄
    char *name;    // 姓名
    char gender;   // 性别
    char *address; // 家庭住址
};
// 声明结构体变量
struct Student stu;
// 声明结构体指针并初始化
struct Student *ptr = &stu;

 通过结构体指针访问成员

结构体指针可以通过“->” 操作符访问结构体的成员。

#include <stdio.h>
int main()
{   
    // 结构体
    struct Student
    {
        char *name;
        int age;
        char gender;
    };
    // 结构体变量
    struct Student s = {"张三", 20, 'M'};
    // 通过结构体变量访问成员
    printf("name=%s,age=%d,gender=%c \n", s.name, s.age, s.gender);

    // 声明结构体指针
    struct Student *ps = &s;
    // 结构体指针通过解引用访问成员
    printf("name=%s,age=%d,gender=%c\n", (*ps).name, (*ps).age, (*ps).gender);
    // 结构体指针使用->访问成员
    printf("name=%s,age=%d,gender=%c\n", ps->name, ps->age, ps->gender);

    return 0;
}

输出结果:

name=张三,age=20,gender=M 
name=张三,age=20,gender=M
name=张三,age=20,gender=M

总结:如果指针变量p指向一个结构体变量stu,以下3种用法等价: 

  1. stu.成员名
  2. (*p).成员名
  3. p->成员名

 总结

区分三个概念:结构体、结构体变量、结构体变量的成员。

结构体是自定义的数据类型,表示的是一种数据类型。结构体变量代表一个具体变量。类比:

int num1;        // int 是数据类型, 而num1是一个具体的int变量
struct Car car1; // Car 是结构体数据类型,而car1是一个Car变量

Car就像一个汽车图纸,生成出来的具体的一辆辆汽车,就类似于一个个的结构体变量。这些结构体变量都含有相同的成员,将结构体变量的成员比作零件,同一张图纸生产出来的零件的作用都是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值