C语言自定义类型:结构体详解

在 C 语言的编程世界里,结构体就像是一个神奇的盒子,它能够将不同类型的数据整齐地收纳在一起,方便我们对相关数据进行统一管理和操作。今天,我将带你深入探索 C 语言自定义类型——结构体的奥秘,让新手也能轻松掌握这一强大工具。

 

结构体类型的声明

 

结构体类型是一种自定义的数据类型,它允许我们把不同类型的数据组合在一起。结构体类型的声明就像是在告诉计算机:“我要创建一个特殊的盒子,这个盒子里可以装各种各样的小东西,比如整数、字符、浮点数等等。”

 

 

结构体声明的基本语法

 

struct 结构体标签名 {

    成员变量列表;

};

 

 

例如,我们想描述一个学生的信息,可以这样声明一个结构体:

 

struct Student {

    char name[20]; // 学生的姓名

    int age; // 学生的年龄

    char sex[5]; // 学生的性别

};

 

在这个例子中,`struct Student`就是我们自定义的结构体类型,它包含了三个成员变量:`name`(字符数组,用于存储姓名)、`age`(整型,用于存储年龄)和`sex`(字符数组,用于存储性别)。

 

 

结构体变量的创建和初始化

 

声明了结构体类型后,我们就可以创建结构体变量了。创建结构体变量就像是按照我们之前设计的盒子模板,实际制作出一个个可以存放数据的盒子。

 

 

创建结构体变量

 

struct Student stu1;

 

这行代码创建了一个名为`stu1`的结构体变量,它是一个能够存储学生信息的“盒子”。

 

我们还可以在创建的同时对结构体变量进行初始化,也就是给盒子里的小东西赋予初始值。

 

 

初始化结构体变量

 

struct Student stu1 = {"张三", 20, "男"};

 

这行代码不仅创建了结构体变量`stu1`,还将其成员变量分别初始化为:`name`为“张三”,`age`为 20,`sex`为“男”。

 

 

结构成员访问操作符

 

当我们有了结构体变量后,如何取出盒子里的小东西(即访问成员变量)呢?这就需要用到结构成员访问操作符了。

 

C 语言中有两种结构成员访问操作符:`.`(点操作符)和`->`(箭头操作符)。

 

 

点操作符(.)

 

点操作符用于访问结构体变量的成员。语法形式为:

 

结构体变量名.成员变量名

 

比如,我们想获取`stu1`的名字,可以这样写:

 

char* name = stu1.name;

 

 

这行代码将`stu1`的`name`成员的值赋给了字符指针`name`。

 

 

箭头操作符(->)

 

箭头操作符用于通过指向结构体的指针来访问成员变量。语法形式为:

 

指针变量名->成员变量名

 

例如:

 

struct Student* ptr = &stu1;

char* name = ptr->name;

 

这里,我们先定义了一个指向`struct Student`类型的指针`ptr`,并让它指向`stu1`。然后通过`ptr->name`访问`stu1`的`name`成员。

 

 

结构体内存对齐

 

在计算机的内存中,数据并不是随意存放的。结构体在内存中的存储会涉及到内存对齐的问题。内存对齐就像是在整理书架,为了方便存取,不同大小的书(数据)会有一定的对齐规则。

 

内存对齐的主要目的是为了提高数据的访问效率。计算机在访问内存时,一次操作通常只能读取特定大小的数据块(如 4 字节、8 字节等)。如果数据在内存中没有按照一定的对齐规则存放,可能会导致访问效率降低,甚至出现错误。

 

结构体传参

 

在函数调用时,我们常常需要将结构体作为参数传递给函数。结构体传参有两种方式:传值和传地址。

 

 

传值

 

传值是将整个结构体变量的副本传递给函数。这种方式的优点是不会修改原结构体变量的值;缺点是如果结构体很大,可能会导致效率较低。

 

void printStudent(struct Student stu) {

    printf("姓名:%s,年龄:%d,性别:%s\n", stu.name, stu.age, stu.sex);

}

 

// 调用函数

printStudent(stu1);

 

 

传地址

 

传地址是将指向结构体变量的指针传递给函数。这种方式效率更高,但需要注意函数内部对结构体的修改会影响原结构体变量。

 

void updateStudentAge(struct Student* stu, int newAge) {

    stu->age = newAge;

}

 

// 调用函数

updateStudentAge(&stu1, 21);

 

 

结构体实现位段

 

位段是结构体中的一个特殊特性,它允许我们为结构体的成员指定占用的位数。这在某些需要精确控制内存使用或者与硬件交互的场景中非常有用。

 

位段的声明

 

struct BitField {

    unsigned int flag : 1; // 占用 1 位

    unsigned int value : 4; // 占用 4 位

};

 

在这个例子中,`flag`成员占用 1 位,`value`成员占用 4 位。整个结构体总共占用 5 位(1 字节中的 8 位中的 5 位)。

 

总结

 

结构体是 C 语言中一个功能强大的工具,它允许我们自定义数据类型,将不同类型的数据组合在一起进行统一管理和操作。通过本文的讲解,我们学习了结构体类型的声明、结构体变量的创建和初始化、成员访问操作符、内存对齐、传参以及位段等重要知识。

 

对于新手来说,结构体可能会有一些复杂的概念,但只要多加练习,理解每个知识点并运用到实际编程中,你就能熟练掌握结构体,为你在 C 语言编程的道路上增添一份强大的能力。

 

现在你对 C 语言结构体的理解如何呢?在学习结构体的过程中,你遇到了哪些挑战或者有趣的发现?欢迎在评论区留言分享,让我们一起交流学习心得!

基于html+python+Apriori 算法、SVD(奇异值分解)的电影推荐算法+源码+项目文档+算法解析+数据集,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 电影推荐算法:Apriori 算法、SVD(奇异值分解)推荐算法 电影、用户可视化 电影、用户管理 数据统计 SVD 推荐 根据电影打分进行推荐 使用 svd 模型计算用户对未评分的电影打分,返回前 n 个打分最高的电影作为推荐结果 n = 30 for now 使用相似电影进行推荐 根据用户最喜欢的前 K 部电影,分别计算这 K 部电影的相似电影 n 部,返回 K*n 部电影进行推荐 K = 10 and n = 5 for now 根据相似用户进行推荐 获取相似用户 K 个,分别取这 K 个用户的最喜爱电影 n 部,返回 K*n 部电影进行推荐 K = 10 and n = 5 for now Redis 使用 Redis 做页面访问次数统计 缓存相似电影 在使用相似电影推荐的方式时,每次请求大概需要 6.6s(需要遍历计算与所有电影的相似度)。 将相似电影存储至 redis 中(仅存储 movie_id,拿到 movie_id 后还是从 mysql 中获取电影详细信息), 时间缩短至:93ms。 十部电影,每部存 top 5 similar movie 登录了 1-6 user并使用了推荐系统,redis 中新增了 50 部电影的 similar movie,也就是说,系统只为 6 为用户计算了共 60 部电影的相似度,其中就有10 部重复电影。 热点电影重复度还是比较高的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值