c++socket 结构体包含指针_从药材柜和空间戒指,到数组、结构体和指针

编程语言中的基础类型很容易理解,整型用于存放整数、浮点数用于存放小数、字符型用来存放字符,除了这些基本类型外,还有一些可以类比到所有编程语言中的复杂类型并不容易理解。科技大爆发的今天,少儿编程日益火爆,我们可以不会编程,却需要了解一些基本的编程概念,让我们来一起探索一下他们吧。

药材柜:内存存储结构

我们知道,计算机内存的最小单位是位,每个位可以存储一个0或者1,8个位组成另一个字节(为什么一个字节8位?最初的计算机使用ASSCLL码存储字母和一些符号,共128个,7个位就可以表示所有的这些编码,多出来的首尾用作奇偶校验)。内存就是由一个个字节作为单位构建起来的,我们可以把内存看做是一个药材柜,上面有很多小格子,数据就如同药材一样存储在一个又一个小格子里。

9b1afbeb0894a664e44eb4c2766cf230.png

药材柜

我们来看下面一句代码:

int a[5] ;

在这段C语言代码中,我们定了一个整型数组a,其长度是5,可以存放5个整型数字,一个整型数据在内存中占据4个字节(一般为4个,不同编译器和操作系统不同)。

什么是数组呢?

在程序设计中,为了方便程序处理,通常把具有相同类型的一组变量组织在一起,这些按序排列的同类数据元素的集合称为数组。

在这个定义中,我们可以看出数组概念的几个要点:

1、数组被分配了一块连续的内存

2、数组中每个元素的类型都一样

3、数组的元素按顺序连续存放

上面我们创建的数组a在内存中中的存储模式就如下图所示:

21b73a1978a2ea99dab0101e833594f9.png

数组在内存中的存在方式

我们可以把一个数组看做是药材柜中的一列,图中的10000、10004、10016等表示内存编号(第几个格子),他们是连续的,后面的公式表示如何根据起始地址加上数据长度的计算每个变量在内存中的位置。这种简单的数据结构很容易通过类比来理解。

貌似空间戒指:数组里面还有数组

一种新的情况来了,有一天,你想在内存中存储5个学生的信息,使用简单的数组就不易做到,这时你急需一种可以用来存放结构的类型。

typedef struct STUDENT //定义一个结构体

{

char name[4];

int age;

}

struct STUDENT stu[5];

上面这个代码定义的数组就不是简单的数据类型了,我们使用了一种新的结构给它起名为student,每一个student都有两项,name用来存放学生名字(char类型每一位存放一个字母),age用来存放年龄,两者一起代表了一个学生。我们用一个数组stu存储了5个学生的信息。这种使用struct声明的新的类型就是结构体

结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。

在这个例子中,数组中的每个元素都是一个结构体,结构体里又存放数组,这样形成了一种间接的数组套数组的结构。

如果我们用上面的药材柜来表示内存,这种嵌套的感觉就像药材柜抽屉里还有一个药材柜(没错,我就是个套娃),简直让人头大。这个时候,我们的另一个比喻就要闪亮登场了,那就是——空间戒指。看过玄幻魔幻仙侠小说的读者都知道,空间戒指是一种必不可少的法宝,空间戒指里面貌似有一片独立空间,你可以把重要物品放入其中,这样就不必把所有的宝贝都背在身上了,既省了很多力气,又能不让别人知道你有什么宝贝而引起觊觎。小说里甚至还有能随身携带仓库到处跑, 着实让人羡慕不已。

扯远了,那么,上面这种复杂的结构在内存中是怎么存在的呢?是不是真的在柜子抽屉里放了个空间戒指呢?如下图我们可以看到,结构体中的数据项在内存中是连续存储的(内存对齐的情况我们暂不讨论),并没有在药材柜格子中放置了一个空间戒指,看着真是令人大失所望。

b168bf98f19b2a4929d7e5d68e3960c8.png

stu结构

真正的空间戒指来了

不要着急,一起来看另一段代码,这段代码表示了一种数据结构——链表中的一个节点,一个节点包含了两个变量,data用来存放节点的数据,next用来指向其后面的节点,通过next连接node,node里的next又连接另一个node,这样依次就形成一个链条,真是子子孙孙无穷尽也,

struct node{

int data; //定义数据域

struct node *next; //定义指针域,存储直接后继的节点信息

};

这段代码有一种奇怪的语法 struct node *,这是什么呢?这个新东西叫做指针。

指针是C语言中的一种特殊的类型,不同于整型存放数字、字符型存放字符,指针是一种保存变量地址的变量。指针的值也是一种数字,长度一般4个字节,这个数字代表的是内存的地址(内存的地址编号是数字)

在这里,next表示了它将存储一个结构体node的引用,这段代码在内存中如何表示呢,他们是如何做到看起来像是自己套自己呢?

dde876544498409655c6995005c9897f.png

链表

从这个图中,我们可以看到next并不是里面又存了一个node节点,他只是存储了另一个node节点的信标,这才是真正的空间戒指。熟读各种超凡侧的同学们肯定又知道了,空间戒指里的空间并不是真的在空间戒指里,空间戒指只是作为了一个入口,我们通过这个入口可以干涉到另一片别人接触不到的空间。可以说空间戒指是某块空间的坐标。

总结:药材柜和空间戒指

内存中的存储单元可以类比成药材柜的一个个格子,每个格子里可以存放药材(数据),也可以放置空间戒指(指针),空间戒指自身里面没有空间,它只是作为信标连接了药材柜子的其他格子。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值