Java中如何模拟指针操作,以迁移C++代码

1.前言

前段时间做了一项重要的工作,就是将原来开源的ICTCLAS的C++代码,全部迁移到了Java语言重新实现,在迁移完成以后,初步测试没有啥大问题,在此过程中得到了一点小小的经验,特记录下来,以供大家参考。

2.问题的分析

虽然说Java语言是从C++演化过来,语法关键词基本类似,但C++语言和Java语言相比,有一个最为关键的不同,就是Java 不支持指针,无法直接进行地址的计算,这样的话,就给代码迁移带来了很大的困难。

例如下面这段代码,是C++的原始代码。

499121b721cc810445bfc75cad113c29.png

Java代码

1bool CContextStat::GetItem(int nKey,PMYCONTEXT *pItemRet)

2{//Get the item according the nKey

3 PMYCONTEXT pCur=m_pContext,pPrev=NULL;

4if(nKey==0&&m_pContext)

5 {

6 *pItemRet=m_pContext;

7return true;

8 }

9while(pCur!=NULL&&pCur->nKey10 {//delete the context array

11 pPrev=pCur;

12 pCur=pCur->next;

13 }

14if(pCur!=NULL&&pCur->nKey==nKey)

15 {//find it and return the current item

16 *pItemRet=pCur;

17return true;

18 }

19 *pItemRet=pPrev;

20return false;

21}

在这段代码中,要将这段代码使用Java来实现,最为头疼的地方就是*这个操作符号了,因为Java里面不能直接操作内存地址,因此必须采用转换的方式来进行模拟实现。

3.解决思路

在C语言里面,*操作符号和&操作符号是相对的,一个用来将指针所在地址赋值,一个用来获取一个内存地址。而在Java里面,内存地址是无法直接访问,也无法直接获取的。

因此在上面的例子中,我们首先定义一个PMYCONTEXT类。这个类代表一个一级指针。

26f278c4f74aedb5f6f051153a987dde.png

Java代码

22/**

23 * PMYCONTEXT的定义是一个指向结构体MYCONTEXT的指针, 是一个一级指针

24 * @author liujunsong

25 *

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐