轻松高效拿捏C语言15结构体初识

程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java、鸿蒙、嵌入式、人工智能等开发,专注于程序员成长的那点儿事,希望在成长的路上有你相伴!君志所向,一往无前!


为什么需要结构体?

C 语言内置的数据类型,除了几种原始的基本数据类型,只有数组属于复合类型,可以同时包含多个值,但是只能包含相同类型的数据,实际使用场景受限。

举例:

现有一个需求,编写学生档案管理系统,这里需要描述一个学生的信息。该学生的信息包括学号、姓名、性别、年龄、家庭住址等,这些数据共同说明一个学生的总体情况。

这些数据类型各不相同,无法使用数组进行统一管理。

传统的解决方法

尝试1:单独定义多个变量存储,实现需求。但是,多个变量,不便于数据的管理。

尝试2:使用数组,它是一组具有相同类型的数据的集合。但在编程中,往往还需要一组类型不同的数据,例如猫的名字使用字符串、年龄是int,颜色是字符串,因为数据类型不同,不能用一个数组来存放。

尝试3:C语言提供了结构体。使用结构体,内部可以定义多个不同类型的变量作为其成员。

什么是结构体

C 语言提供了 struct关键字,允许自定义复合数据类型,将不同类型的值组合在一起,这种类型称为结构体(structure)类型。

C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。

其实大家在HarmonyOS开发中,是不是也经常使用struct关键字?

结构体的声明

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

struct 结构体名{ 
    数据类型1 成员名1;   //分号结尾
    数据类型2 成员名2; 
    ……
    数据类型n 成员名n;
}; //注意最后有一个分号

比如定义一个学员:

struct Student{       // 定义结构体:学生
    int id;           //学号
    char name[20];    //姓名
    char gender;      //性别
    char address[50]; //家庭住址
}; 

结构体变量和调用

定义了新的数据类型以后,就可以声明该类型的变量,这与声明其他类型变量的写法是一样的。

声明结构体变量格式1:

struct 结构体类型名称 结构体变量名;

注意,声明自定义类型的变量时,类型名前面,不要忘记加上 struct 关键字。

举例:

struct Student stu1;

调用结构体变量的成员:

结构体变量名.成员名 [= 常量或变量值]

举例:

#include <stdio.h>
#include <string.h>
int main() {

    struct Student stu1; //声明结构体变量
 
    //调用结构体成员
    stu1.id = 1001;
    //stu1.name = "Tom"; //报错,不能直接通过赋值运算符来给字符数组赋值
    strcpy(stu1.name, "Tony");
    stu1.gender = 'M';
    strcpy(stu1.address, "北京市海淀区五道口");

    printf("id = %d,name = %s,gender = %c,address = %s\n", 
           stu1.id, stu1.name, stu1.gender, stu1.address);

    return 0;
}

说明:

1)先声明了一个 struct Student类型的变量 stu1,这时编译器就会为 stu1 分配内存,接着就可以为 stu1 的不同属性赋值。可以看到,struct 结构的属性通过点( . )来表示,比如 id 属性要写成 stu1.id。

2)字符数组是一种特殊的数组,直接改掉字符数组名的地址会报错,因此不能直接通过赋值运算符来对它进行赋值。你可以使用字符串库函数 strcpy() 来进行字符串的复制操作。

声明结构体变量格式2:

除了逐一对属性赋值,也可以使用大括号,一次性对 struct 结构的所有属性赋值。

此时,初始化的属性个数最好与结构体中成员个数相同,且成员的先后顺序一一对应。格式:

struct 结构体名 结构体变量={初始化数据};

声明结构体变量格式3:

方式2中大括号里面的值的顺序,必须与 struct 类型声明时属性的顺序一致。

此时,可以为每个值指定属性名。

格式:

struct 结构体名 结构体变量={.成员1=xxx,.成员2=yyy,...};

声明结构体变量格式4: 声明类型的同时定义变量

struct 的数据类型声明语句与变量的声明语句,可以合并为一个语句。格式:

struct 结构体名 {
    成员列表
} 变量名列表;

声明结构体变量格式5: 不指定类型名而直接定义结构体类型变量

如果类型标识符(比如Student、Circle、Employee等)只用在声明时这一个地方,后面不再用到,那就可以将类型名省略。 该结构体称为匿名结构体

格式:

struct {
    成员列表;
} 变量名列表;

声明结构体变量格式6: 使用 typedef 命令

使用 typedef 可以为 struct 结构指定一个别名,这样使用起来更简洁。

区分

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

  • 结构体是自定义的数据类型,表示的是一种数据类型。

  • 结构体变量代表一个具体变量。类比:

    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、付费专栏及课程。

余额充值