123
WSKAŹNIKI NA FUNKCJE
Można także zastosować bardziej oszczędny sposób alokowania tablicy wielowymiarowej, a mianowicie:
sdefine ROZMIAR 10
int i;
int **tabliczka ■ malloc(ROZMIAR * sizeof ‘tabliczka);
•tabliczka - malloc(ROZMIAR * ROZMIAR * sizeof “tabliczka); for (i - 1; KROZMIAR; “i) {
tabliczka[i] ■ tabliczka[0] ♦ (i • ROZMIAR);
for (i = 0; i<R0ZMIAR; “i) { int j;
for (j - 0; j<R0ZMIAR; “j) { tabliczkafi] [j] » (i+l)*(j+l);
free(‘tabliczka); free(tabliczka);
Powyższy kiwi działa w ten sposób, że zamiast dla poszczególnych wierszy alokować osobno pamięć alokuje pamięć dla wszystkich elementów tablicy i dopiero później przypisuje wskazania poszczególnych wskaż ni ków- wi erszy na kolejne bloki po ROZMIAR elementów.
Sposób ten jest bardziej oszczędny z dwóch powodów: Po pierwsze wykonywanych jest mniej o|>eracji przydzielania |xamięci (bo tylko dwie). Po drugie za każdym razem, gdy alokuje się pamięć trochę miejsca się marnuje, gdyż funkcja malloc musi w stogu przechowywać różne dodatkowe informacje na temat każdej zaalokowanej przestrzeni. Ponadto, czasami ak>kacja odbywa się blokami i gdy zażąda się niepełny blok to reszta bloku jest tracona.
Zauważmy, że w ten sposób możemy uzyskać nie tylko normalną, “kwadratową” tablicę (dla dwóch wymiarów). Możliwe jest np. uzyskanie tablicy trójkątnej:
0123
012
01
0
lub tablicy o dowolnym innym rozkładzie <11 ugości wierszy, np.:
const size_t wymiary[] - {2, 4, 6, 8, 1, 3, 5, 7, 9); int i;
int “tablica = malloc((sizeof wymiary / sizeof ‘wymiary) » sizeof ‘tablica); for (i = 0; i<10; ++i) {
tablica[i] » malloc(wymiary[i] * sizeof “tablica);
Gdy nabierzesz wprawy w używaniu wskaźników oraz innych funkcji malloc i realloc nauczysz się wykonywać różne inne o|>eracje takie jak do<lawanie kok*jnych wierszy, usuwanie wierszy, zmiana rozmiaru wierszy, zamiana wierszy miejscami it p.
Dotychczas zajmowaliśmy się sytuacją, gdy wskaźnik wskazywał na jakąś zmienną. Jednak nie tylko zmienna ma swój adres w pamięci. Oprócz zmiennej także i funkcja musi mieć swoje