Указатель на элемент двумерного массива.Как я могу передать это функции? - PullRequest
0 голосов
/ 26 октября 2011

Я создал двумерный массив char.Размер указывается пользователем.

N = atoi(argv[1]);
char table[N][N];
// fill it

Теперь мне нужна функция, которая имеет указатель на любой элемент этого массива.Я хочу использовать рекурсивность, чтобы пройти через эту матрицу (в обоих измерениях).Можно ли определить такую ​​функцию?Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 26 октября 2011

Ответ от ObscureRobot в порядке, и ниже есть и другое решение.

Используйте typedef и позвольте компилятору управлять смещением массива. Смотрите код ниже.

#include <assert.h>

void test(char **table, int y) /* the x dimension is not needed here */
{
    typedef char array_t[y];
    typedef array_t *array_ptr;
    array_t *tmp_array = (array_ptr)table;
    /* and access the table */
    tmp_array[1][2] = 1;
    return;
}

int main()
{
    char table[2][3];
    table[1][2] = 0;
    assert(table[1][2] == 0);
    test((char**)table, 3);
    assert(table[1][2] == 1);
    return 0;
}

Отредактировано: извините, но я сначала загрузил неверную версию, которая сейчас исправлена. Если вы не можете его скомпилировать, используйте текущий код или проверьте, есть ли такой дополнительный астероид, как он, в array_t *tmp_array = (*array_ptr)table;, строка 7. Если это так, просто удалите последний.

Кроме того, код отлично работает на моем ноутбуке с gcc (GCC) 4.6.1 20110819 (prerelease) с параметрами компиляции gcc a.c или gcc a.c -ansi

2 голосов
/ 26 октября 2011

Следующая функция примет вашу таблицу в качестве аргумента: process_table(table, N, N)

void process_table(char *input_table, unsigned int x_dimension, unsigned int y_dimension)
{
  // do stuff
}

Затем, если вам нужно перебрать значения в вашей матрице:

void process_table(char *input_table, unsigned int x_dimension, unsigned int y_dimension)
{
  for(int i=0; i<N; i++)
    for(int j=0; j<N; j++)
    {
      // operate on the array element *(input_table + i + y*j)
    }
}
...