Реарганизация программы для передачи массивов в функции Си
#include <stdio.h>
#include <stdlib.h>
#define COL_ARR 100
#define ROW_ARR 100
void output(int *arr, int collumn, int row);
void output1(int **arr, int collumn, int row);
int inputType(int * type);
int inputRowCol(int *collumn, int *row);
int createStaticMatrix(int *arr, int collumn, int row);
int createDinamicMatrix1(int ***arr, int collumn, int row);
int createDinamicMatrix2(int ***arr, int collumn, int row);
int createDinamicMatrix3(int ***arr, int collumn, int row);
int main(void) {
int **dinamicArr = NULL;
int collumn = 0, row = 0;
int typeCase = 0;
if (inputType(&typeCase) && inputRowCol(&collumn, &row)) {
int staticArr[ROW_ARR][COL_ARR];
if (typeCase == 1 && createStaticMatrix((int *)staticArr, collumn, row)) {
output((int *)staticArr, collumn, row);
} else if (typeCase == 2 && createDinamicMatrix1(&dinamicArr, collumn, row)) {
output1(dinamicArr, collumn, row);
free(dinamicArr);
} else if (typeCase == 3 && createDinamicMatrix2(&dinamicArr, collumn, row)) {
output1(dinamicArr, collumn, row);
for (int i = 0; i < row; ++i) {
free(dinamicArr[i]);
}
free(dinamicArr);
} else if (typeCase == 4 && createDinamicMatrix3(&dinamicArr, collumn, row)) {
output1(dinamicArr, collumn, row);
free(dinamicArr[0]);
free(dinamicArr);
} else {
printf("n/a");
}
} else {
printf("n/a");
}
return 0;
}
void output(int *arr, int collumn, int row) {
for (int i = 0; i < row; ++i) {
for (int j = 0; j < collumn; ++j) {
if (j < collumn - 1) {
printf("%d ", *(arr + collumn * i + j));
} else {
printf("%d", *(arr + collumn * i + j));
}
}
printf("\n");
}
}
void output1(int **arr, int collumn, int row) {
for (int i = 0; i < row; ++i) {
for (int j = 0; j < collumn; ++j) {
if (j < collumn - 1) {
printf("%d ", arr[i][j]);
} else {
printf("%d", arr[i][j]);
}
}
printf("\n");
}
}
int inputType(int *type) {
int flag = 1;
char check = '\0';
if (scanf("%d%c", type, &check) != 2 || check != '\n' || (*type <= 0 || *type > 4)) {
flag = 0;
}
return flag;
}
int inputRowCol(int *collumn, int *row) {
int flag = 1;
char check = '\0';
if (scanf("%d %d%c", row, collumn, &check) != 3 || check != '\n' || (*row < 1 && *collumn < 1)) {
flag = 0;
}
return flag;
}
int createStaticMatrix(int *arr, int collumn, int row) {
int flag = 1;
for (int i = 0; i < row; ++i) {
for (int j = 0; j < collumn; ++j) {
if (scanf("%d", &arr[collumn * i + j]) != 1) {
flag = 0;
}
}
}
return flag;
}
int createDinamicMatrix1(int ***arr, int collumn, int row) {
int flag = 1;
*arr = malloc(collumn * row * sizeof(int) + row * sizeof(int *));
int *ptr = (int *)(*arr + row);
for (int i = 0; i < row; ++i) {
(*arr)[i] = ptr + collumn * i;
}
for (int i = 0; i < row; ++i) {
for (int j = 0; j < collumn; ++j) {
if (scanf("%d", &(*arr)[i][j]) != 1) {
flag = 0;
}
}
}
return flag;
}
int createDinamicMatrix2(int ***arr, int collumn, int row) {
int flag = 1;
*arr = malloc(row * sizeof(int *));
for (int i = 0; i < row; ++i) {
(*arr)[i] = malloc(collumn * sizeof(int));
}
for (int i = 0; i < row; ++i) {
for (int j = 0; j < collumn; ++j) {
if (scanf("%d", &(*arr)[i][j]) != 1) {
flag = 0;
}
}
}
return flag;
}
int createDinamicMatrix3(int ***arr, int collumn, int row) {
int flag = 1;
*arr = malloc(row * sizeof(int *));
int *valuesArray = malloc(collumn * row * sizeof(int));
for (int i = 0; i < row; ++i) {
(*arr)[i] = valuesArray + collumn * i;
}
for (int i = 0; i < row; ++i) {
for (int j = 0; j < collumn; ++j) {
if (scanf("%d", &(*arr)[i][j]) != 1) {
flag = 0;
}
}
}
return flag;
}
Как реорганизовать программу,чтобы лучше понять передачу массивов по указателям. Может есть способы попроже и попонятней?