指针指向的元素索引

时间:2016-10-29 21:51:00

标签: c arrays pointers

我有一个声明为

的2D字符数组
char A[100][100]

我还有一个指针指向该数组的一个元素

char *ptr;
ptr = A[5]

此指针被传递给另一个函数,该函数需要能够知道该指针的索引(在本例中为5)

void func(void *ptr) {
int index = ???
}

我该怎么做?这甚至可能吗?

2 个答案:

答案 0 :(得分:3)

是的,如果你可以在A中看到func(A只是一个双重索引的1D数组,而不是数组上的指针,这就是可能的原因)。

#include <stdio.h>

char A[100][100];

void func(void *ptr) {
  char *ptrc = (char*)ptr;
  printf("index %d\n",int((ptrc-A[0])/sizeof(A[0])));
}

int main()
{
  char *ptr = A[5];
  func(ptr);
}

结果:

index 5

当然,如果你将一个不相关的指针传递给func,你将会得到未定义的结果。

注意:需要将传入的void *指针强制转换为char *,否则编译器不会让我们区分不兼容类型的指针。

编辑:当我被chqrlie挑战来计算两个索引时,我尝试了它并且它起作用了(还增加了安全性以防止使用不相关的指针调用函数):

#include <stdio.h>
#include <assert.h>

char A[100][100];

void func(void *ptr) 
{
  char *ptrc = (char*)ptr;
  ptrdiff_t diff = (ptrc-A[0]);
  assert(0 <= diff);
  assert(diff < sizeof(A));
  printf("index %d %d\n",(int)(diff/sizeof(A[0])),(int)(diff % sizeof(A[0])));
}

int main()
{
  char *ptr = &(A[5][34]);
  func(ptr);
}

结果:

index 5 34

答案 1 :(得分:2)

您可以计算ptr从数组开头的偏移量并导出坐标:

#include <stdio.h>
#include <stdlib.h>

char A[100][100];

void func(void *ptr) {
    if (ptr == NULL) {
        printf("ptr = NULL\n");
        return;
    }
    ptrdiff_t pos = (char *)ptr - A[0];
    if (pos < 0 || pos > (ptrdiff_t)sizeof(A)) {
        printf("ptr points outside A: ptr=%p, A=%p..%p\n",
               ptr, (void*)A, (void*)&A[100][100]);
    } else {
        printf("ptr = &A[%d][%d]\n",
               (int)((size_t)pos / sizeof(A[0])),  // row number
               (int)((size_t)pos % sizeof(A[0])))  // column number
    }
}

int main(void) {
    char *ptr = &A[5][3];
    func(ptr);
    return 0;
}