Вы можете сделать это с любым типом данных. Просто сделайте указатель на указатель:
typedef struct {
int myint;
char* mystring;
} data;
data** array;
Но не забывайте, что вы все равно должны распределять переменную malloc, и она становится немного сложной:
//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");
}
}
Код для освобождения структуры выглядит аналогично - не забывайте вызывать free () для всего, что у вас есть. (Также в надежных приложениях вы должны проверить возврат malloc () .)
Теперь предположим, что вы хотите передать это функции. Вы все еще можете использовать двойной указатель, потому что вы, вероятно, хотите делать манипуляции со структурой данных, а не указатель на указатели структур данных:
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.