关于C语言的一些思考【struct 关键字的理解和使用】

4 篇文章 0 订阅
4 篇文章 0 订阅

关于C语言的一些思考【struct 关键字的理解和使用】

对于新手的建议,学习C语言是给你以后编程生涯打下扎实基础的重要一步,无论你以后工作是用Java, Python, 亦或其他语言。对C语言深入的理解都能给你提供重要帮助。
犹喜欢一位大哥曾经在某书上写的一段话,“C语言(包括C++),操作系统,CPU体系架构(包括汇编)作为编程界的三大基础,就像功夫世界里面的易经经,是无上的内功,掌握来这些,大师们可以在编程世界里自由发挥,甚至创造一门新的语言。”
这里提一个问题,在CPU体系架构中,作者特别括弧指出来包括汇编,而不是把汇编放到C语言,或者单独提出来,是基于什么考量了?我想如果您知道其中缘由,您必然对三者其一的CPU体系架构有了自己的理解,也欢迎大家来评论。
好了,废话不多说,作为新手,你应该怎么理解和使用struct 关键字了?
理解的前提,是你清楚知道它的定义,struct 顾名思义,就是结构体的含义【定义一个类型的结构,类似int 这样一个整形模子】。
那怎么使用了,刚开始的时候,你必然喜欢用全局变量,一个文件里面,当然无可厚非,自娱自乐嘛,自己看得懂就行,但是实际工作中,你写代码你是要考虑别人也能看得懂的,这是编程习惯,更是编程的修养。结构体怎么用了,这里需要提一个思想,类的思想,虽然过早,但用这个思想来借用一下,也是比较好解释,比如你现在要写一个小学生期中成绩统计表,需要你做一个快速查询的功能,那你应该怎么构思了?
第一点,你肯定是以人为主体,那这个人有哪些信息来,【姓名,性别,班级,语文成绩,数学成绩,英语成绩】,那你就可以按这些信息来组成一个结构体,

struct studentchar name[50];
char gender; //0:女生 1:男生
char class; //班级
unsigned char  chinese_score; //语文成绩
unsigned char  math_score;//数学成绩
unsigned char  english_score;//英语成绩;

这样子你就构建了一个统一的类型,struct student, 它的作用就行关键字int 一样,是一个模子。
那就可以根据这个类型来添加学生信息,struct student xiaoming;

strcpy(xiaoming.name, "xiaoming"); //include <string.h>
xiaoming.gender = 1;//男生
xiaoming.class = 2;//2班
xiaoming.chinese_score = 90;
xiaoming.math_score = 95;
xiaoming.english_score = 93;

至此,xiaoming 同学的信息就添加好了,如果你需要创建一个表格,你还可以这样
struct student class_2[50];然后将xiaoming 这个变量copy到数据class_2[0]中。
这里以学生来定义的一个类型,就是想告诉你,你在自己写代码的时候,要有这种构造类的思维,将一类实物抽象出来,转成软件所能表达的形式,这个在你以后工作中,是司空见惯的。你在一开始学习的时候就要有这个准备。而我当时学的时候,因为是刚大学学编程,完全没有这种思维,所以想对学弟学妹们后来人提醒一下。

对于简历上所说精通C语言的朋友,那你真的能理解了struct吗?
提到C语言,总有人诟病她不支持面向对象,是面向结构的,但真正熟练掌握C的程序员,从不诟病这个,面向对象只是一种思维,而不是语言本身,为什么,因为C语言中的struct 就可以实现面向对象的思维用法。以人类为例,一个人可能包括哪些了,【姓名,性别,年龄,身高,体重】这些信息就可以初步展示一个人的信息,好,我们来构造一下,

struct human_basechar name[200];
char gender;
unsigned char age;
unsigned char height;
unsigned char weight;
};

那如果要加上肤色了?

struct human_with_shintone {
struct human_base  hb;
unsigned char skin_tone; // 0: 黄种人, 1:黑种人, 2: 白种人
}
//如果加上国家了,
struct human_with_country{
struct human_with_shintone hst;
unsigned char country ; /0 中国,1 US,2 Germany..【这里我比较建议用枚举】
};

虽然不那么恰当,但是也能很好的说明了,C语言是可以志愿类的继承的。这种思维是程序员所需要具备的。

关于柔性数组,也是值得简单聊一下的,在C99中引入,在结构体最后一个元素允许是未知大小的数组,称为柔性数组成员。但结构体在柔性数组成员前面必须至少有一个成员。有几点提一下,
1, sizeof 返回这种结构体大小,不包括柔性数组成员大小。
2, 柔性数组成员需要用malloc()函数来动态分配。

typedef   struct st_type {
int age;
int arr[];
}type_a;

这样我们就定义了一个可变长的结构体,它的对象分配如下,

type_a *prA = (type_a*)malloc(sizeof(type_a) + 50 * sizeof(int))

这样用到了typedef 的关键字,也建议新手在定义结构体的时候用上这个别名关键字typedef, 如上面提到的,

typedef structchar name[50];
char gender; //0:女生 1:男生
char class; //班级
unsigned char  chinese_score; //语文成绩
unsigned char  math_score;//数学成绩
unsigned char  english_score;//英语成绩student_t;

这样引用student_t 就更加简洁和方便了。
释放就需要用free(prA);
类的方法实现,

struct  st_with_func{
int data;
void (*func_1)(int a, char*);
int (*func_2)(int *param1, void * pr2);
};

将函数指针引入进来,构建类的方法。
关于结构体更多的故事,我们放到指针在说。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝晨若溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值