首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查找单元格索引号。在二维数组中?

如何查找单元格索引号。在二维数组中?
EN

Stack Overflow用户
提问于 2016-05-23 12:06:52
回答 2查看 289关注 0票数 0

在C语言程序设计中,如果给出一个二维数组,如( int,a5),并且还给出了特定元素(单元)的基地址和地址,则必须找到索引no。元素(单元格)(行和列号)我们能找到吗?如果是,是如何实现的?

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

int aR;

地址(Ai)=ba+size(C*i+ j);

如果给定ba,R,C,大小和地址(Ai)...如何找到i和j的值?

为了求2个变量的值,我们需要2个方程,我找不到2个方程。,..but。

EN

回答 2

Stack Overflow用户

发布于 2016-05-23 12:26:26

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

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

  1. 在“纯数学”术语中,你必须除以数组中元素的大小。
  2. 在"C“术语中,当你减去指针时,系统会为你执行这个除法。

例如:

代码语言:javascript
复制
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语言参与进来,它会尝试为你做数学运算:

代码语言:javascript
复制
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风格)或一个数字(纯数学)差异,这取决于您如何计算computation.
  2. offset = number / SIZE。如果需要,这将完成作业。
  3. i=偏移量/ R。此处为整数除法-只需丢弃余数。
  4. j=偏移量- (i* R )或j=偏移量%R。选择要使用的运算:乘法和减法或取模。
票数 1
EN

Stack Overflow用户

发布于 2016-05-23 14:38:16

  • 特定地址减去基址得到了从基址到特定地址的字节数。
  • 如果将字节数除以sizeof(ba[0][0]) (或sizeof(int)),则得到items.
  • items / C的数量为第一维,items % C为第二维。

因此:

代码语言:javascript
复制
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]类型的数组指针。它们不是兼容的类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37382520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档