如何找到细胞索引号。 在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.选择要使用的操作:乘和减或模数。