C/Tablice: Różnice pomiędzy wersjami

Dodane 234 bajty ,  2 lata temu
m
Update syntaxhighlight tags - remove use of deprecated <source> tags
m (Wycofano edycje użytkownika 91.201.19.30 (dyskusja). Autor przywróconej wersji to Adam majewski.)
Znacznik: Wycofanie zmian
m (Update syntaxhighlight tags - remove use of deprecated <source> tags)
Przykład:
 
<sourcesyntaxhighlight lang=c>
/*
http://joequery.me/code/snprintf-c/
}
 
</syntaxhighlight>
</source>
 
===Tablice wielowymiarowe===
Rozważmy teraz konieczność przechowania w pamięci komputera całej macierzy o wymiarach 10 x 10. Można by tego dokonać tworząc 10 osobnych tablic jednowymiarowych, reprezentujących poszczególne wiersze macierzy. Jednak język C dostarcza nam dużo wygodniejszej metody, która w dodatku jest bardzo łatwa w użyciu. Są to '''tablice wielowymiarowe''', lub inaczej "tablice tablic".
Tablice wielowymiarowe definiujemy podając przy zmiennej kilka wymiarów, np.:
<sourcesyntaxhighlight lang="c">
float macierz[10][10];
</syntaxhighlight>
</source>
Tak samo wygląda dostęp do poszczególnych elementów tablicy:
<sourcesyntaxhighlight lang="c">
macierz[2][3] = 1.2;
</syntaxhighlight>
</source>
Jak widać ten sposób jest dużo wygodniejszy (i zapewne dużo bardziej "naturalny") niż deklarowanie 10 osobnych tablic jednowymiarowych.
Aby zainicjować tablicę wielowymiarową należy zastosować zagłębianie klamr, np.:
<sourcesyntaxhighlight lang="c">
float macierz[3][4] = {
{ 1.6, 4.5, 2.4, 5.6 }, /* pierwszy wiersz */
{ 8.8, 7.5, 4.3, 8.6 } /* trzeci wiersz */
};
</syntaxhighlight>
</source>
Dodatkowo, pierwszego wymiaru nie musimy określać (podobnie jak dla tablic jednowymiarowych) i wówczas kompilator sam ustali odpowiednią wielkość, np.:
<sourcesyntaxhighlight lang="c">
float macierz[][4] = {
{ 1.6, 4.5, 2.4, 5.6 }, /* pierwszy wiersz */
{ 6.3, 2.7, 5.7, 2.7 } /* czwarty wiersz */
};
</sourcesyntaxhighlight>
Innym, bardziej elastycznym sposobem deklarowania tablic wielowymiarowych, jest użycie wskaźników. Opisane to zostało w następnym [[C/Wskaźniki#Tablice wielowymiarowe|rozdziale]].
 
 
Przykładowy program :
<sourcesyntaxhighlight lang=c>
/*
http://stackoverflow.com/questions/2151084/map-a-2d-array-onto-a-1d-array-c/2151113
}
}
</syntaxhighlight>
</source>
 
 
===Sposoby deklaracji tablic===
Tablicę deklaruje się w następujący sposób:
<sourcesyntaxhighlight lang="c">
typ nazwa_tablicy[rozmiar];
</syntaxhighlight>
</source>
gdzie rozmiar oznacza ile zmiennych danego typu możemy zmieścić w tablicy. Zatem aby np. zadeklarować tablicę, mieszczącą 20 liczb całkowitych możemy napisać tak:
<sourcesyntaxhighlight lang="c">
int tablica[20];
</syntaxhighlight>
</source>
Podobnie jak przy deklaracji zmiennych, także tablicy możemy nadać wartości początkowe przy jej deklaracji. Odbywa się to przez umieszczenie wartości kolejnych elementów oddzielonych przecinkami wewnątrz nawiasów klamrowych:
<sourcesyntaxhighlight lang="c">
int tablica[3] = {0,1,2};
</syntaxhighlight>
</source>
 
Niekoniecznie trzeba podawać rozmiar tablicy, np.:
<sourcesyntaxhighlight lang="c">
int tablica[] = {1, 2, 3, 4, 5};
</syntaxhighlight>
</source>
W takim przypadku kompilator sam ustali rozmiar tablicy (w tym przypadku - 5 elementów).
 
Rozpatrzmy następujący kod:
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
#define ROZMIAR 3
return 0;
}
</syntaxhighlight>
</source>
Wynik:
 
 
Spróbujmy przedstawić to na działającym przykładzie. Przeanalizuj następujący kod:
<sourcesyntaxhighlight lang="c">
int tablica[5] = {0};
int i = 0;
printf ("tablica[%d]=%d\n", i, tablica[i]);
}
</syntaxhighlight>
</source>
Jak widać, na początku deklarujemy 5-elementową tablicę, którą od razu zerujemy. Następnie pod trzeci i czwarty element (liczone począwszy od 0) podstawiamy liczby 3 i 7. Pętla ma za zadanie wyprowadzić wynik naszych działań.
 
 
Wystarczy pomylić się o jedno miejsce (tzw. błąd [[w:off by one|off by one]]) by spowodować, że działanie programu zostanie nagle przerwane przez system operacyjny ( [[C/Błędy#B.C5.82.C4.99dy_przy_uruchamianiu|błąd przy uruchamianiu]] ) :
<sourcesyntaxhighlight lang="c">
int foo[100];
int i;
 
/* program powinien zakończyć się błędem */
</syntaxhighlight>
</source>
 
 
90

edycji