我们都知道,在C语言中,结构体中的字段都是可以访问的。或者说,在C++ 中,类和结构体的主要区别就是类中成员变量默认为private,而结构体中默认为public。结构体的这一个特性,导致结构体中封装的数据,实际上并没有封装,外界都可以访问结构体重的字段。

C++中我们尚可用类来替代结构体,但是,C语言中是没有类的,只能用结构体,但很多时候,我们需要隐藏结构体的字段,不让外界直接访问,而是通过我们写的函数进行间接访问,这样就提高了程序的封装性。
实现方法,简单来说,就是,结构体定义时,要定义在.c文件中,然后我们自己定义一些访问结构体的函数,在.h文件中,只存放函数原型声明和对结构体的声明。
看个例子
.c文件中
//stu.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu{
char id[10];
int score;
};
struct stu *new_stu()
{
struct stu *s;
s = (struct stu *)malloc(sizeof(struct stu));
return s;
}
void set_id(struct stu *s,char *id)
{
strcpy(s->id,id);
}
char *get_id(struct stu *s)
{
return s->id;
}
可以看到,在.c文件中,我定义了一个结构体,并且定义了一些用于操作这个结构体的函数。
在.h文件中
stu.h #ifndef STU_H #define STU_H struct stu; extern void set_id(struct stu *s,char *id); extern char *get_id(struct stu *s); extern struct stu *new_stu(); #endif
在.h中我声明了一下结构体struct stu,并且写了函数的原型声明,供其他文件调用。
在main.c中我引用了stu.h
下面是main.c
#include <stdio.h>
#include "stu.h"
int main()
{
//struct stu s;
//s.score = 100;
//struct stu s = {{0}};
struct stu *s;
s = new_stu();
set_id(s, "950621");
char *id = NULL;
id = get_id(s);
printf("设置的id为:%s\n",id);
return 0;
}
可以看到,在main函数中,我先是定义了一个struct stu类型的指针,然后通过new_stu()给这个指针分配了空间,在通过另外两个函数对其进行了操作。
这里需要注意一下我注释掉的部分,说明一下:
这种情况下,不能定义struct stu类型的变量!!!
因为:
.h文件中,只是对结构体进行了声明,并没有结构体具体细节的描述,也就是在main.c中只是声明了一下struct stu,这样编译器就知道有个结构体类型叫struct stu,但是它并不知道stu的内部细节。
我们都知道,定义一个变量,编译器是要给它分配内存空间的,但是,此时编译器并不知道stu的内部细节,也就不知道stu这个结构体的变量要占多少空间,自然无法分配内存。这样在编译时期就会报错。
但是定义一个指针变量就不一样啦,不管是什么类型的指针,占据的内存空间都是4个字节,编译器只需要确定有个叫struct stu 的类型存在就好了,而.h中那个声明,就是在告诉编译器,有这么一个类型。
同时,这种情况下也不能访问结构体的字段,比如,s->score=100;这条语句在编译时就会报错,原因和上面一样,编译器并不知道struct stu结构体的内部细节。
通过上面的方法,在除了stu.c文件之外的其他文件中,只能通过stu.c中定义的函数来间接操作结构体变量,而不能直接对结构体变量进行操作,包括不能创建一个结构体变量!
这样就很好地体现了程序的封装性,也提高了程序的安全性。但是就需要我们写很多操作函数啦,包括创建结构体指针变量分配空间的函数。
我们也可以在.h文件中用typedef声明一个结构体的指针类型,如 typedef struct sut * pStu;
这样在main.c中就可以用pStu声明结构体指针变量了。
# c语言隐藏结构体
# c语言结构体
# c语言结构体教程
# C语言结构体(struct)常见使用方法(细节问题)
# 对C语言中sizeof细节的三点分析介绍
# C语言中宏定义使用的小细节
# C语言中#define与typedef的互换细节详解
# 程序员都不知道C语言中的这些小细节
# 都是
# 有个
# 也就
# 可以看到
# 报错
# 进行了
# 默认为
# 情况下
# 提高了
# 这一
# 就会
# 是在
# 很好
# 就不
# 可以用
# 对其
# 这条
# 写了
# 只需要
# 时就
相关文章:
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何选择高性价比服务器搭建个人网站?
寿县云建站:智能SEO优化与多行业模板快速上线指南
网站图片在线制作软件,怎么在图片上做链接?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何快速搭建FTP站点实现文件共享?
建站之星如何助力企业快速打造五合一网站?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
建站主机选购指南与交易推荐:核心配置解析
如何快速搭建高效可靠的建站解决方案?
建站主机服务器选购指南:轻量应用与VPS配置解析
如何挑选高效建站主机与优质域名?
如何在阿里云服务器自主搭建网站?
如何在IIS中新建站点并配置端口与物理路径?
建站主机是否等同于虚拟主机?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
如何在阿里云部署织梦网站?
如何快速查询域名建站关键信息?
香港网站服务器数量如何影响SEO优化效果?
北京网站制作的公司有哪些,北京白云观官方网站?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
建站之星如何一键生成手机站?
,柠檬视频怎样兑换vip?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
制作公司内部网站有哪些,内网如何建网站?
c# 服务器GC和工作站GC的区别和设置
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
网站制作需要会哪些技术,建立一个网站要花费多少?
C#如何使用XPathNavigator高效查询XML
seo网站制作优化,网站SEO优化步骤有哪些?
Java解压缩zip - 解压缩多个文件或文件夹实例
怀化网站制作公司,怀化新生儿上户网上办理流程?
制作证书网站有哪些,全国城建培训中心证书查询官网?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
网站网页制作专业公司,怎样制作自己的网页?
盐城做公司网站,江苏电子版退休证办理流程?
如何在Windows 2008云服务器安全搭建网站?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
Swift中swift中的switch 语句
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
济南专业网站制作公司,济南信息工程学校怎么样?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
长沙企业网站制作哪家好,长沙水业集团官方网站?
建站VPS选购需注意哪些关键参数?
如何快速生成可下载的建站源码工具?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
建站之星安装提示数据库无法连接如何解决?
如何实现建站之星域名转发设置?
*请认真填写需求信息,我们会在24小时内与您取得联系。