如何找到细胞指数没有。在二维数组?

时间:2016-05-23 04:06:52

标签: c arrays multidimensional-array memory-address

在C编程中,如果给出2-D数组(int a [5] [3]),并且还给出了特定元素(单元格)的基址和地址,并且必须找到索引号。我们可以找到那个元素(单元格)(行和列号)吗?如果是的话怎么样?

我知道寻找地址的公式就是这样

int a [R] [C];

地址(a [i] [j])= ba + size(C * i + j);

如果给出ba,R,C,大小和地址(a [i] [j])...如何找到i和j的值?

为了找到2变量的值,我们需要2个方程..但我无法找到第二个方程。

2 个答案:

答案 0 :(得分:1)

使用整数除法和余数运算符。

如果你有base和指向元素的指针elt,那么有两件事:

  1. 在“纯数学”术语中,您必须除以数组中元素的大小。

  2. 在“C”术语中,当你减去指针时,会为你执行此除法。

  3. 例如:

    int a[2];
    
    ptrdiff_t a0 = (ptrdiff_t)&a[0];
    ptrdiff_t a1 = (ptrdiff_t)&a[1];
    
    a1 - a0; // likely 4 or 8.
    

    这可能是4或8,因为在您正在使用的任何机器上可能是int的大小,并且因为我们执行了两个数字的“纯数学”减法。

    但如果你让C介入,它会尝试为你做数学运算:

    int a[2];
    
    int * a0 = &a[0];
    int * a1 = &a[1];
    
    a1 - a0; // 1
    

    因为C知道类型,并且因为它是法则,减去的数字会自动除以类型的大小,将指针差异转换为类似数组的索引或偏移量。

    这很重要,因为它会影响你的数学运算方式。

    现在,如果您知道elt的地址是base + SIZE * (R * i + j),您可以找到整数除法的答案(可以自动执行),减法,更多整数除法和模数或乘以&减;

    1. 偏移或数字= elt - base。这将为您提供索引(C样式)或数字(纯数学)差异,具体取决于您的计算方式。

    2. offset = number / SIZE。如果您需要,这将完成工作。

    3. i = offset / R.此处整数除法 - 只丢掉其余部分。

    4. j =偏移 - (i * R)或j =偏移%R。选择您要使用的操作:乘法&减去或模数。

答案 1 :(得分:1)

  • 特定地址减去基地址,为您提供从基数到特定地址的字节大小。

  • 如果您将该大小(以字节为单位)除以sizeof(ba[0][0])(或sizeof(int)),则会获得项目数。

  • items / C为您提供第一个维度,items % C为您提供第二个维度。

因此:

int ba[R][C];
uintptr_t address = (uintptr_t)&ba[3][2]; // some random item

size_t items = (address - (uintptr_t)ba) / sizeof(ba[0][0]);
size_t i = items / C;
size_t j = items % C;

使用具有明确定义的行为的某种类型执行算术非常重要,因此uintptr_t

如果我已完成int* address,那么address - ba将是无意义的,因为ba会衰减为int(*)[3]类型的数组指针。它们不是兼容的类型。