Передача многомерных массивов в качестве аргументов функции в C

голоса
46

В C я могу передать многомерный массив в функцию в качестве единственного аргумента, когда я не знаю, что размеры массива будут?

Кроме того мой многомерный массив может содержать, кроме строк типов.

Задан 06/08/2008 в 23:01
источник пользователем
На других языках...                            


4 ответов

голоса
31

Pass явного указателя на первый элемент с размерами массива в виде отдельных параметров. Например, для обработки произвольного размера 2-D массивов Int:

void func_2d(int *p, size_t M, size_t N)
{
  size_t i, j;
  ...
  p[i*N+j] = ...;
}

который будет называться

...
int arr1[10][20];
int arr2[5][80];
...
func_2d(&arr1[0][0], 10, 20);
func_2d(&arr2[0][0], 5, 80);

Тот же принцип применим и для более высокого двумерными массивами:

func_3d(int *p, size_t X, size_t Y, size_t Z)
{
  size_t i, j, k;
  ...
  p[i*Y*Z+j*Z+k] = ...;
  ...
}
...
arr2[10][20][30];
...
func_3d(&arr[0][0][0], 10, 20, 30);
Ответил 16/12/2009 в 18:18
источник пользователем

голоса
19

Вы можете сделать это с любым типом данных. Просто сделайте это указатель указатель на:

typedef struct {
  int myint;
  char* mystring;
} data;

data** array;

Но не забывайте, что вы все еще должны таНос переменную, и она действительно становится немного сложным:

//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array

//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);

//iterate over 'y' dimension
for(y=0;y<h;y++){
  //malloc the 'x' dimension
  array[y] = malloc(sizeof(data) * w);

  //iterate over the 'x' dimension
  for(x=0;x<w;x++){
    //malloc the string in the data structure
    array[y][x].mystring = malloc(50); //50 chars

    //initialize
    array[y][x].myint = 6;
    strcpy(array[y][x].mystring, "w00t");
  }
}

Код для освобождения структура выглядит так же - не забудьте позвонить бесплатно () на все , что вы malloced! (Кроме того , в надежных приложениях , которые вы должны проверить возвращение таНоса () .)

Теперь предположим, что вы хотите, чтобы передать это функции. Вы все еще можете использовать двойной указатель, потому что вы, вероятно, хотите сделать манипуляции на структуру данных, а не указатель на указатели структур данных:

int whatsMyInt(data** arrayPtr, int x, int y){
  return arrayPtr[y][x].myint;
}

Вызов этой функции с:

printf("My int is %d.\n", whatsMyInt(array, 2, 4));

Вывод:

My int is 6.
Ответил 07/08/2008 в 01:34
источник пользователем

голоса
15

Вы можете объявить функцию, как:

f(int size, int data[][size]) {...}

Компилятор будет делать все арифметические операции над указателями для вас.

Обратите внимание , что размеры размеров должны появиться до того самого массива.

GNU C позволяет переадресацию аргумент декларации (в случае, если вам действительно нужно пройти размеры после массива):

f(int size; int data[][size], int size) {...}

Первое измерение, хотя вы можете передать в качестве аргумента тоже не имеет смысл для компилятора C (даже для SizeOf оператора, когда он применяется в течение массива, переданный в качестве аргумента всегда будет относиться как указатель на первый элемент).

Ответил 08/07/2014 в 05:33
источник пользователем

голоса
-2
int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix 
{
    return p[0][0];  
}

int main()
{
   int *u[5]; // will be a 5x5 matrix

   for(int i = 0; i < 5; i++)
       u[i] = new int[5];

   u[0][0] = 1; // initialize u[0][0] - not mandatory

   // put data in u[][]

   printf("%d", matmax(u, 0)); //call to function
   getche(); // just to see the result
}
Ответил 03/01/2012 в 13:51
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more