在C语言程序设计中,如果给出一个二维数组,如( int,a5),并且还给出了特定元素(单元)的基地址和地址,则必须找到索引no。元素(单元格)(行和列号)我们能找到吗?如果是,是如何实现的?
我知道查找地址的公式是这样的
int aR;
地址(Ai)=ba+size(C*i+ j);
如果给定ba,R,C,大小和地址(Ai)...如何找到i和j的值?
为了求2个变量的值,我们需要2个方程,我找不到2个方程。,..but。
发布于 2016-05-23 12:26:26
使用整数除法和余数运算符。
如果您有一个base和一个指向元素elt的指针,那么有两件事:
例如:
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),您可以使用整数除法(可能会自动为您执行)、减法、更多的整数除法以及模数或乘法和减法来找到答案:
发布于 2016-05-23 14:38:16
sizeof(ba[0][0]) (或sizeof(int)),则得到items.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]类型的数组指针。它们不是兼容的类型。
https://stackoverflow.com/questions/37382520
复制相似问题