Stałe, tablice dynamiczne i wielowymiarowe
tylko do odczytu STAŁE - CONST
tablice: const int dni_miesiaca[12]=31,28,31,30,31,30,31,31,30,31,30,31; const słowo kluczowe const sprawia, że wartość zmiennej nie może zostać zmodyfikowana za pomocą przypisania, inkrementacji, dekrementacji. const int zmienna=12; //dobrze const int zmienna; zmienna= 12; //źle Zmienna staje się tylko do odczytu. wskaźniki: const float *ptr; //lub float const *ptr; //ptr wskazuje na stałą wartość float(wartość stała a wskaźnik może ulec zmianie float *const ptr; //ptr jest stałym wskaźnikiem(wskaźnik będzie wskazywał zawsze na to samo miejsce) const float * const *ptr; // wskaźnikiem(wskaźnik będzie wskazywał zawsze na to samo miejsce i wartość tam przechowywana nie może się zmienić w funkcjach: void wyswietl(const int tab[], int ROZMIAR); // lub void wyswietl(const int *tab, int ROZMIAR); // przekazuje tablicę do funkcji uniemożliwiając jej ingerencję w dane
dynamiczna alokacja pamięci TABLICE DYNAMICZNE
tablice dynamiczne do tej pory zawsze definiowaliśmy rozmiar tablicy przed kompilacją programu. Dynamiczne alokowanie pamięci pozwala nam ustalić rozmiar tablicy w trakcie działania programu. Może być tak, iż malloc nie znajdzie odpowiedniej ilości miejsca w pamięci wtedy zwróci wskaźnik zerowy(null) if (ptr==null) printf( Za mało dostępnej pamięci ); exit(exit_failure); double *ptr; ptr=(double *) malloc (30*sizeof(double)); funkcja malloc szuka bloków wolnej pamięci o odpowiedniej wielkości i zwraca adres pierwszego bajtu przydzielonego bloku. double tablica[n]; //gdzie n jest zmienną ptr=(double *)malloc(n*sizeof(double)); malloc rezerwuje tylko pamięć nie ingerując w jej zawartość. Po zarezerwowaniu pamięci i skorzystaniu z niej należy ją zwolnić funkcją free(); free(ptr); Innym sposobem dynamicznego przydziału pamięci jest funkcja calloc(). Różni się ona tym, że ingeruje w zarezerwowaną pamięć przypisując wszystkim bitom bloku wartość 0. int *ptr; ptr=(int *)calloc(n, sizeof(int)); Pamięć przydzieloną w powyższy sposób również zwalniamy funkcją free().
wstęp TABLICE WIELOWYMIAROWE
tablice wielowymiarowe inaczej tablice tablic deklaracja: float deszcz[5][12]; //jest to tablica 5 tablic 12 elementowych typu float. Widok jak na rysunku jest tylko wygodnym sposobem przedstawienia tablicy w rzeczywistości jest to ciągły obszar pamięci przechowujący kolejno pierwszą 12-el. tablicę, następnie kolejną, itd. Więcej wymiarów: tablica 3D: int pudelko[10][20][30]; Inicjalizacja tablicy: #define MIESIACE 12 #define LATA 5... const float deszcz[lata][miesiace] = 4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6, 8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3, 9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4, 7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2, 7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2 ;
operowanie na tablicach do przemieszczania się po tablicach 2D należy użyć dwóch pętli for pierwsza do poruszania się po wierszach, druga zaś do poruszania się po kolumnach. Do przetwarzania danych w tablicach 3D używa się 3 zagnieżdżonych pętli, dla 4D czterech itd. for (rok = 0; rok < LATA; rok++) for (miesiac = 0; miesiac < MIESIACE; miesiac++) printf( %f \t,deszcz[rok][miesiac]); printf( \n );
WSKAŹNIKI A TABLICE WIELOWYMIAROWE
int tablica[4][2]; tablica[2][1] *(*(tablica+2)+1) tablica adres pierwszego elementu złożonego z 2 liczb całkowitych tablica+2 adres trzeciego elementu złożonego z 2 liczb całkowitych *(tablica+2) trzeci element tablicy złożony z 2 liczb całkowitych(adres pierwszego el. tej podtablicy)(wartość int) *(tablica+2)+1 adres drugiego elementu tej podtablicy(wartość int) *(*(tablica+2)+1) druga wartość int w trzecim rzędzie.
FUNKCJE A TABLICE WIELOWYMIAROWE
#include <stdio.h> #define WIERSZE 3 #define KOLUMNY 4 void sumuj_wiersze(int tab[][kolumny], int wiersze); void sumuj_kolumny(int [][KOLUMNY], int ); // ok, mozna pominac nazwe int sumuj2d(int (*tab)[kolumny], int wiersze); // jeszcze inna skladnia int main(void) int graty[wiersze][kolumny] = 2,4,6,8, 3,5,7,9, 12,10,8,6 ; sumuj_wiersze(graty, WIERSZE); sumuj_kolumny(graty, WIERSZE); printf("suma wszystkich elementow = %d\n", sumuj2d(graty, WIERSZE)); return 0; void sumuj_wiersze(int tab[][kolumny], int wiersze) int w; int k; int suma; for (w = 0; w < wiersze; w++) suma = 0; for (k = 0; k < KOLUMNY; k++) suma += tab[w][k]; printf("wiersz %d: suma = %d\n", w, suma); void sumuj_kolumny(int tab[][kolumny], int wiersze) int w; int k; int suma; for (k = 0; k < KOLUMNY; k++) suma = 0; for (w = 0; w < wiersze; w++) suma += tab[w][k]; printf("kolumna %d: suma = %d\n", k, suma); int sumuj2d(int tab[][kolumny], int wiersze) int w; int k; int suma = 0; for (w = 0; w < wiersze; w++) for (k = 0; k < KOLUMNY; k++) suma += tab[w][k]; return suma;
tablice N-wymiarowe Aby zadeklarować wskaźnik odpowiadający N-wymiarowej tablicy musimy określić wartości dla wszystkich par nawiasów, poza skrajnie lewą. int sumuj4d( int tab[][10][20][30], int wiersze); int sumuj4d( int (*tab)[10][20][30], int wiersze);