C中的一个指针/数组问题

问题描述:

我按照以下网页:C中的一个指针/数组问题

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是?什么电流池可以实现? in 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指针/阵列....

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) ; 
} 

是的,我可以使用显示器(ARR)和显示器(&编曲[0]) ,他们是一样的!

+0

pool是data_t的数组。所以,pool可以用于指针操作。 – Abhineet

+1

对我来说,一个关于指针数学的强大文章是C必须是SO的某处,但对于我来说,我找不到一个我推荐的人。如果有人阅读这篇文章,有一个很好的候选人可以用它来链接它;因为我认为OP现在可以正确使用它。 **编辑**:好的。 [这是一个很不错的好] RQ = 1)。 – WhozCraig

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

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

+7

'sl.pool'是* not *指针。它是一个数组。他们*不是*一样。指针是一个变量,它保存一个地址;一个数组是一个变量,它有效地是一个地址。 'sl.pool'是一个指针,'sl.pool ++'是有效的;它不是。 – WhozCraig

+0

@WhozCraig。谢谢。编辑我的答案。 – rcs

+0

我不明白第一句话。它看起来好像是'sl.pool'和'sl.pool [0]'是一样的 - 这是不正确的。 – glglgl

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

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中。因此,他们为第二行处理找到了有效的数组索引。

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

将指针获取到本地变量甚至寄存器以便访问更容易。

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

假定sl.current指向的数组sl.pool的元素之一。所以sl.current - sl.pool得到data_t *各自的距离,所以它得到当前的指标。 + 1前进到下一个索引和% 16你实现了16的值 - 这将是非法的 - 指向0。

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

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

+0

这个概念的一部分,我很确定它是一个斗争新手指针数学是类型化指针差异。这是指针的标量增加的对立面。在你的“data_t”子句中,你表现得相当不错,但即使如此,我认为OP可能会让人挠头。Imnsho,实际上没有简单的方法来描述它,从而迅速启示。他们)通常帮助。(+1,btw)。 – WhozCraig