C中的指针/数组问题

时间:2013-10-22 09:05:02

标签: c arrays pointers

我已关注以下网页:

http://www.1024cores.net/home/lock-free-algorithms/reader-writer-problem/improved-lock-free-seqlock

来源如下:

struct data_t 
{ 
    int seq; // sequence number 
    int data [1024]; // user data 
}; 

struct seqlock_t 
{ 
    data_t* current; 
    data_t pool [16]; // 16 user objects are held 
}; 

seqlock_t sl; 

结构非常简单,令我困惑的是:

data_t* d0 = sl.current; // load-consume
int idx = (sl.current - sl.pool + 1) % 16; 
data_t* d = &sl.pool[idx]; 

sl.current是指针,sl.pool是?当前的池可以实现什么? 在c language视图中,我该如何解释这个陈述?

int idx = (sl.current - sl.pool + 1) % 16;

编辑:

感谢所有信息,它帮了很多!!!在我自己的编码风格中会使用 int idx =(sl.current - & [sl.pool [0])+ 1)%16; 现在我知道&(sl.pool [0])与sl.pool相同! 我应该弄明白,下面的例子,我之前读过的, showes pointer / array ....

void display(int *p)
{
    int idx ;
    printf("(%d)(%d)\n",*p,p[1]) ;
}
int main()
{
    int i,Arr[10] ;
    for(i=0;i<10;i++)
        Arr[i] = i + 100;
    display(Arr) ;
}

是的,我可以使用display(Arr)和display(&amp; Arr [0]),它们是一样的〜!!

3 个答案:

答案 0 :(得分:6)

sl.current是一个指针。 sl.pool是一个数组,通过这样写,它等于&sl.pool[0]。所以它指向数组的第一个元素。我们可以做一些指针操作,比如减法,在这种情况下获取一些索引。

我发现这个链接http://www.eskimo.com/~scs/cclass/notes/sx10b.html很容易理解一些指针算法。

答案 1 :(得分:2)

data_t* d0 = sl.current; // load-consume

将指针转换为局部变量甚至是寄存器,以便更轻松地访问。

int idx = (sl.current - sl.pool + 1) % 16; 

假设sl.current指向数组sl.pool的其中一个元素。因此,sl.current - sl.pooldata_t *的形式获取相应的距离,因此它获取当前索引。 + 1前进到下一个索引,% 16表示值为16 - 这将是非法的 - 而是指向0。

data_t* d = &sl.pool[idx];

这指向新的;我想以后会来sl.current = d或类似的东西。

答案 2 :(得分:1)

从我可以通过给定的信息推断出来::

int idx = (sl.current - sl.pool + 1) % 16; 
data_t* d = &sl.pool[idx]; 

s1.pool是一个数组。因此,否定s1.pool会给出一些价值,比如int x。现在((x+1) % 16)将为s1.pool提供有效的数组绑定索引,该索引存储在idx中。因此,他们为第二行处理找到了有效的数组索引。