关闭
关闭
首页 > 嵌入式软件 > Uc/os II

uC/OS-II内存管理函数内最难理解的部分就是二维指针,本文以图文并茂的方式对二维指针进行了详细分析与讲解。看完本文,相信对C里面指针的概念又会有进一步的认识。

本文引用地址: http://embed.21ic.com/software/ucos/201801/50282.html

一、OSMemCreate( ) 函数中有如下语句:

OS_MEM *pmem;

INT8U *pblk;

void **plink;

INT32U i;

plink = (void **)addr; //指向所申请内存分区的起始地址

pblk = (INT8U *)addr + blksize; //所申请内存的第二个Block的起始地址

for (i = 0; i < (nblks - 1); i++) //依次申请nblks个Block,链接成单向链表

{

*plink = (void *)pblk;

plink = *plink;

pblk = pblk + blksize;

}

红色部分是初学者对本函数最难理解的部分,因为其用到了二维指针。二维指针就是指向指针的指针,他的内容是一个目标变量的地址,也就是说仍然是一个指针,对二维指针取两次内容才能取到目标变量的内容。这里先复习一下指针的知识:

int a = 5;

int *ptr;

ptr=&a; //ptr指针是地址,指向变量a所在地址。

则可以得出:

*ptr=a; //即指针ptr指向变量a所在地址,*ptr的值就是a的值5

由此类推,对于二维指针变量**plink,指针plink是地址,*plink是plink所指向的地址内的数据,不过同时这个数据也是一个指针,并且**plink是指针(*plink)所指向的地址内的数据。

一维指针所指向的地址内存放的是普通数据,如上述ptr指针所指向的地址内存放的是int型数据5。

二维指针所指向的地址内存放的是一个一维指针,如上述指针plink所指向的地址内存放的是指针*plink。

下面详细分析上述OSMemCreate函数内的语句:

1、plink = (void **)addr;

addr本来是一个一维指针,指向所申请内存分区的起始地址。本句将addr强制转换为二维指针(注意经过强制转换后addr指针本身指向的地址是没有变化的),并将addr地址值赋给plink。则plink的内存中存储的是addr的值,即plink也指向addr所指向的分区起始地址,并且这个地址内存放的内容是指针(*plink),但指针(*plink)还未指向具体的地址。在这条语句之前,这个起始地址内的数据内容是未知的(由编译器分配的)。内存分区结构见下图1所示(假设申请的内存区有4个Block)。

 

图1

在这个函数当中,我们想把addr指向的二维数组,分割成大小相同的若干块,并用指针把它们链接起来,链接指针放在每个block的首地址。但由于addr是一维指针,它指向的内容不会被解释成一个地址,而是一般的内容。我们要在这些block的首地址内存放指针,所以将addr强制转换成二维指针的目的就是让编译器将addr指向的内容解释成地址,也就是一个指针。

再将addr赋值给plink(让plink去执行连接的操作),使plink与addr指向同一个地址。*plink就是取plink与addr指向地址单元的内容,而这个内容是一个指针,也就是在以前addr指向的地方放上指针*plink。

2、pblk = (INT8U *)addr + blksize;

让pblk指向所申请内存的第二个Block的起始地址,见下图2所示。

因为addr是void型的,要强制转换为INT8U型。

 

图2

3、*plink = (void *)pblk; //实际上是*plink = pblk,因为pblk是INT8U型的,要强制转换为void型

在for循环内对二维指针plink执行取内容操作(其内容为指针), *plink也是一个指针了(plink指针所代表的地址的内容),将下一个block的首地址赋值给*plink,使它指向的地方改为下一个blcok开始的地址处。

起始地址内的指针*plink被赋值为pblk,所以*plink与pblk一样指向下一个blcok开始的地址处。

如图3所示。

 

图3

第一个block首地址内的内容为一个指针,该指针指向下一个block首地址。这个地址内存放的就是*plink的内容**plink。

只不过我们并不需要用到这个**plink。

4、plink = (void **)pblk;

功能与plink = (void **)addr 相似,即plink也指向第二个block的起始地址,并且使这个地址内存放的是指针(*plink)。

 

图4

注意:因为plink所指向的地址变了,此时pblk所指向的地址

内的内容由原来的**plink变为了*plink指针。

并且 *plink还未被赋值,则**plink值是未知的

5、pblk = pblk + blksize;

pblk不断的下移,以指向再下一个block的开始处。

pblk(new)= pblk(old)+blksize

 

图5

当再次进行for循环时,重复上述过程,利用每个block首地址内的指针将每个Block链接起来组成空闲块链表。

同样,*plink被赋值后,指向pblk所指向的地址,则该地址的

内容为**plink,只不过我们并不需要取出**plink。

6、pmem->OSMemFreeList = addr; /*pmem->OSMemFreeList指向空闲块链表第一个block首地址

在完成for循环后,使pmem->OSMemFreeList指向addr,组成完整的空闲块链表。

 

图6

总结:进行(void**)强制转换的目的其实就是为了把所指向的地址的内容转换成一个指针。

换一批

延伸阅读

[新鲜事] 资不抵债 东芝准备卖掉收款机上市公司和东芝医院

资不抵债 东芝准备卖掉收款机上市公司和东芝医院

因为美国核电建设业务的失误,日本东芝减记了63亿美元的资产,目前资不抵债,站在破产边缘。东芝正在千方百计变卖资产,凑集资金。据外媒最新消息,东芝将转让旗下上市的收款机公司股权,富士康有望接盘。东芝还准备变卖一家医院。......

关键字:东芝 收款机 东芝医院

[新鲜事] 美女iPhone 7 Plus突然自燃炸裂 苹果紧急调查

美女iPhone 7 Plus突然自燃炸裂 苹果紧急调查

昨天,推特美女Brianna Olivas爆料,周三晚,自己的iPhone 7 Plus在完全没用的情况下自燃冒烟,场景非常恐怖。......

关键字:iPhone 7 Plus 自燃炸裂

[新鲜事] 让人工智能当客服,亚马逊想把这项服务卖给企业

让人工智能当客服,亚马逊想把这项服务卖给企业

亚马逊给自己开发的人工智能语音助手 Alexa 找了个新用处,去客服中心接电话。......

关键字:人工智能 客服 亚马逊

[疯狂史] 当年骗取上亿经费的汉芯造假事件

当年骗取上亿经费的汉芯造假事件

2003年上海交大芯片与系统研究中心主任陈进以一己之力研制出了“汉芯一号”处理芯片。......

关键字:大学 上海交通大学 清华大学 法律

[新鲜事] 奔驰或将研发纯电动AMG高性能车型

奔驰或将研发纯电动AMG高性能车型

奔驰研发负责人Ola Kallenius近日在接受外媒采访时透露,奔驰不排除电动版AMG车型的可能,或者将会推出EQ子品牌的AMG版本。......

关键字:奔驰 AMG

[疯狂史] 还记得爱因斯坦那张可爱的吐舌照吗?它被84万人民币卖出去了

还记得爱因斯坦那张可爱的吐舌照吗?它被84万人民币卖出去了

据美国CNET报道称,爱因斯坦经典“吐舌照”上月底挂牌拍卖后,最终以12.5万美元的价格成交,折合人民币月84万。......

关键字:爱因斯坦 记者 吐舌照

[趣科技] 全球超算PK:欧洲最强电脑性能只是中国2.5%

全球超算PK:欧洲最强电脑性能只是中国2.5%

超级计算机目前已经成为各国科技“军备竞赛”当中最热的领域之一。因此,每次全球Top 500计算机榜单发布的时候都会引来媒体的关注。其中,中国近些年在超级计算机领域所取得的成绩有目共睹。而全球范围内,超级计算机又发展到了怎样一种地步呢?......

关键字:超级计算机
条评论

我 要 评 论

网友评论

大家都爱看

  • 兆易创新研发14nm嵌入式异构AI芯片

    昨日,兆易创新发表公告,重申了收购上海思立微的目的。兆易创新表示,这次产业并购,旨在整合境内优质的芯片设计领域资产,获取智能人机交互领域的核心技术,拓展并丰富公司产品线,在整体上形…

    2018-01-31
  • 华为的优势,就是自家的各种自研芯片

    CPU即中央处理器,是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。

    2017-08-16
  • 你不知道Ryzen芯片有多火?来看看AMD的股票吧

    据外媒报道,美银美林认为,AMD最新的Ryzen芯片可能会引发一波销售浪潮,进而推动该股继续上涨。它认为AMD股票还有40%以上的上涨空间。

    2017-08-16
  • 国产芯片:厚积薄发,强势崛起

    关于国产芯片,是近几年才有崛起的势头,可是在几年之前,国产芯片还处于“沉睡”的状态,尤其是手机芯片,几乎大部分都依赖进口,而且国外的市场几乎被高通和联发科所垄断,也就展讯还在市场边…

    2017-08-16
  • 为了数据安全 大疆无人机增加隐私飞行功能

    大疆周一表示,在美国陆军因为“网络缺陷”而要求其成员停用大疆无人机后,这家中国无人机制造商将加强无人机的数据安全性。 大疆政策和法务副总裁布伦丹&middot…

    2017-08-15