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

C++中我们尚可用类来替代结构体,但是,C语言中是没有类的,只能用结构体,但很多时候,我们需要隐藏结构体的字段,不让外界直接访问,而是通过我们写的函数进行间接访问,这样就提高了程序的封装性。

实现方法,简单来说,就是,结构体定义时,要定义在.c文件中,然后我们自己定义一些访问结构体的函数,在.h文件中,只存放函数原型声明和对结构体的声明。

看个例子

.c文件中

//stu.c

#include

#include

#include

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

#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语言中隐藏结构体的细节相关推荐

  1. c语言删除文件中的结构体_C语言插入、删除、更改文件内容

    我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...

  2. Linux结构体变量报错,C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  3. c语言中 定义结构体变量初始化,c++中的结构体:声明 定义 初始化

    什么是结构体? 之前的学习中我们知道了数组是一个容器,而且是存放固定大小数据的容器,而且存放的元素的数据类型必须要一致. 比如数据库中有这样的一条记录学号 性别 年龄 成绩 地址应该怎样存放 结构体: ...

  4. 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

    文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...

  5. 【C 语言】文件操作 ( 学生管理系统 | 命令行接收数据填充结构体 | 结构体写出到文件中 | 查询文件中的结构体数据 )

    文章目录 一.学生管理系统 二.代码示例 一.学生管理系统 前两篇博客 [C 语言]文件操作 ( 将结构体写出到文件中并读取结构体数据 | 将结构体数组写出到文件中并读取结构体数组数据 ) [C 语言 ...

  6. c语言中的结构体定义和常见用法

    1.结构体简述和概念 结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型.结构体通常用来表示类型不同但是又相关的若干数据 ...

  7. 结构体复数相乘c语言,复数乘法中的结构体赋值实现代码

    复数乘法中的结构体赋值实现代码 废话不多说,直接上代码 复制代码 代码如下: #include using namespace std; typedef struct { double real; d ...

  8. C语言中的结构体,结构体中数组初始化与赋值

    最近写c语言中的结构体遇到了些问题,从网上找了些资料如下: 结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论: 1.结构体的 ...

  9. c语言中定义结构体指针的作用,C语言结构体定义,使用及指针(1)

    前言 C语言中的结构体作为一大难点,并且对于需要学习数据结构的同学来说,这个结构是每次上课都会遇到的,所以,我们只有更深层次的理解结构体的知识,才能更好的掌握数据结构 结构体用处 结构体到底有什么用? ...

最新文章

  1. 【ES6】ES6编程规范 编程风格
  2. 城市智能化发展中,AI公司应该做什么?
  3. Netty实例:实现简单的通讯功能
  4. 代码分析+原理图解——棋盘覆盖问题-分治法
  5. 外架小横杆外露长度规范要求_脚手架各部位构造要求解读!
  6. 【每日一题】7月16日题目精讲—点权和
  7. 如何做一个国产数据库(二)
  8. 从源码入手,一文带你读懂Spring AOP面向切面编程
  9. python scipy版本_Py之Scipy:Python库之Scipy库的简介、安装、使用方法详细攻略
  10. C语言文件单字符读写,c语言文件读写操作
  11. cocos creator微信小游戏,使用微信云开发实现“世界排行榜”
  12. S.M.A.R.T. 参数(smartctl)计算硬盘精确健康值
  13. DPVS - 小米高性能负载均衡器
  14. 闲置服务器如何利用起来赚点零花钱
  15. java编写车类_用Java程序创建一个汽车接口,接口中要定义汽车应有的属性和行为,随后编写多个汽车接口的实现类,...
  16. 计算机专业课科目,考研计算机专业课有哪些科目
  17. php广告管理,DedeCMS的广告管理功能
  18. .NET5.0 初始
  19. 实验(三):单片机I/O口实验-模拟开关灯
  20. oracle 主键 唯一性,oracle 唯一索引,唯一约束,主键之间的联系

热门文章

  1. HDU 2577 How to Type
  2. 1701. Ostap and Partners(并查集-关系)
  3. 关闭报错_Cydia Impactor工具各种报错提示的解决方法!
  4. 十堰市人民小学一年级在计算机学校,我上一年级啦!
  5. mybatis date类型映射_Mybatis中类型映射处理器详解
  6. 微课|中学生可以这样学Python(8.1节):解析算法例题讲解
  7. 微课|中学生可以这样学Python(2.3.3节):filter()函数
  8. 全国计算机等级考试二级Python考试大纲预测和分析
  9. c语言程序设计李泽中课后,C语言程序设计李泽中课件第4章解读.ppt
  10. mysql视图执行原理_MySql中的视图 触发器 存储过程,以及事物