int指针引用数据

时间:2018-06-10 20:00:02

标签: c++ pointers reference

在下面的一段代码中(我稍微改了一下)假设row 15 。问题是,&data[row >> 6]是否引用了其地址值之外的地址?

    uint64_t volatile *data;
    int numRows = 45;

    numWords = (numRows + 63) >> 6;
    data= new uint64_t[numWords];
    memset((void*)data, 0, sizeof(uint64_t) * numWords);

    int row = 15;
    uint64_t bit = 1LL << (row & 63);
    Or64(&data[row >> 6], bit);

运行修改后的代码我注意到&data[1]指向起始地址 +8 &data[2]起始地址 +16 ,依此类推。

那么,如果数据变量的起始地址(64位长度)是0x00000001,其中referene &data[row >> 6]应该指向?

上面的代码应该改变数据变量中的一些位,如何解释这个?

1 个答案:

答案 0 :(得分:0)

好看后仔细看看现在看起来很清楚。 代码只是将int 64bit值中的一些位设置为掩码数组标志。

在单个64位数字中,我们可以有64个不同的位标志位置,但是如果我们需要比这个数字更多的标志位置,那么我们必须并排采用一个64位数字。 numwords分配这样的64位整数数,因为它由row / 64除法的商显示(右移1等于除2)。

现在,要访问正确的64位掩码阵列,我们几乎做同样的事情。首先,我们尝试找到哪个64位数组标志属于给定的private static ArrayList<String> getHypernymTerm( PointerTargetNodeList ptnl, ArrayList<String> parent2, String str ) throws JWNLException{ ArrayList<String> parent = parent2; if ( !str.equals("entity") ) { for (Iterator<?> itr = ptnl.iterator(); itr.hasNext();) { PointerTargetNode node = (PointerTargetNode) itr.next(); Synset synset = node.getSynset(); String term = synset.getWord(0).getLemma(); parent.add(term); PointerTargetNodeList targets = new PointerTargetNodeList(synset.getTargets(PointerType.HYPERNYM) ); if (targets.size() > 0) { parent = getHypernymTerm( targets, parent, term); } } } return parent; } 数字。如果行&gt;然后63放置到下一个64位位掩码数组(一个大于63且小于128的数字,它向右移动6,返回0)。之后我们可以设置适当的位标志。