【问题标题】:How to get array index by memory address in C? [duplicate]如何通过C中的内存地址获取数组索引? [复制]
【发布时间】:2019-12-06 22:22:26
【问题描述】:

这是我的代码,它可以通过指针找到数组中的最大数字。

#define ELTS 5
#include <stdio.h>
#include <stdlib.h>
int main(void) {
  int i, *high, *p;
  int array[ELTS]={200,34,78,600,45};
  high=array;
  p=array;
  for ( i=1; i< ELTS; i++ ) {
      p++;
      if (*p > *high)  high = p;
  }
  printf("the highest number is %d \n", *high);
  printf("at address %p \n", high);
  printf("index %ld \n", high);
  printf("index %ld \n", array);
  printf("at index %ld of array \n", high-array);

  exit(0);
}

我还需要找到这个数字的索引号,我在网上做了一些研究。并发现我可以使用printf("at index %ld of array \n", high-array); 来获取最高数字的索引。

但是,我不明白它是如何工作的,谁能给我解释一下?

【问题讨论】:

  • 数组声明中使用了什么ELTS?
  • 对不起,我忘了放#define,我编辑了。
  • 您正在使用指针算法。 higharray 都是隐式指针。您可以像ints 一样减去/添加和增加指针。 tutorialspoint.com/cprogramming/c_pointer_arithmetic.htm
  • @uMdRupert:high 不是隐式指针。它是一个实际的显式指针。
  • @EricPostpischil 正确 - 我无法阅读。

标签: c arrays pointers


【解决方案1】:

high-array中,high是你感兴趣的元素的地址,array是数组中第一个元素的地址。 (array 实际上标识了数组,但是在这个表达式中使用时,它会自动转换为第一个元素的地址。)然后,使用- 运算符,将两个地址相减。

当地址被减去时,C 产生一个以数组元素为单位测量的结果。因此,即使数组地址以字节为单位,编译器也会通过减去指针(以获取字节差)然后除以元素中的字节数(以获取元素的差)来计算结果。

因此,high-array 的结果是从数组开头到high 指向的元素的元素数,即该元素的索引。

(在某些 C 实现中,指针可能不是以字节为单位的,也可能不是简单的单数地址。无论如何,C 实现会执行任何必要的操作来生成包含多个元素的结果。)

注意事项

要打印指针,请将它们转换为void * 并使用%p 打印它们:

printf("index %p \n", (void *) high);

要打印两个指针的差异,请使用%td

printf("at index %td of array \n", high-array);

【讨论】:

  • 感谢您的清晰解释!
【解决方案2】:

使用指针算法。该指数的计算方式如下

high - array

差值包含这两个指针之间的 int 类型元素的数量。

以你的程序中的这个语句为例

p++;

在这个语句之后,指针指向数组的下一个元素。这条语句可以改写为

int *q = p;
p = p + 1;

所以p - q 等于1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    相关资源
    最近更新 更多