如何找到细胞索引号。 在2

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

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

int a [R] [C];

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

如果给出了ba,R,C,Size和address(a [i] [j])......如何找到i和j的值?

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


  • 具体的地址减去基地址给出了从基地到特定地址的字节大小。

  • 如果用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]类型的数组指针。 它们不是兼容的类型。


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

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

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

  • 用“C”的术语,当你减去指针时,这个除法就是为你执行的。

  • 例如:

    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)您可以用整数除法(可以自动为您执行),减法,更多整数除法以及模数或乘及减:

  • 偏移量或数字= elt - base。 这会给你一个索引(C风格)或数字(纯数学)的差异,这取决于你如何进行计算。

  • 偏移量=数量/大小。 如果你需要的话,这将完成这项工作。

  • 我=偏移量/河整数除法在这里 - 扔掉剩下的部分。

  • j =偏移量 - (i * R)或者j =偏移量%R.选择要使用的操作:乘和减或模数。

  • 链接地址: http://www.djcxy.com/p/85945.html

    上一篇: how to find cell index no. in 2

    下一篇: Converting 2d array C code to malloc