C/Tablice - więcej

Z Wikibooks, biblioteki wolnych podręczników.
< C
Skocz do: nawigacja, szukaj

Deklaracja tablic[edytuj]

Deklarując tablicę i podając jej wartości początkowe, możemy podać tylko część wartości (mniej niż rozmiar tablicy), pozostałe zainicjowane zostaną zerami. Ponadto, możemy użyć indeksów aby przekazać, które wartości tablicy inicjujemy. Może to się wydać dziwne, ale po ostatnim elemencie tablicy może występować przecinek.

 int tablica1[20] = {1,};
 int tablica2[20] = {0,1,[4]4,[7]=7,8,9,}; /* {0,1,0,0,4,0,0,7,8,9,0,0,0,0,0,0,0,0,0,0) */

Możemy to stosować również przy deklaracji tablicach bez podanego rozmiaru:

int tablica[] = {0, [3]3, 4};  // tablica 5-elementowa

Jak i przy deklaracji tablic wielowymiarowych:

float macierz[4][5] = {
 { 1.6, [2]2.4, 5.6 },    /* pierwszy wiersz */
 [2]{ [1]7.5, [3]=8.6 },    /* trzeci wiersz */
 {},    /* czwarty wiersz */
 { 8.8, 7.5, }    /* piąty wiersz */
};

Definiowanie rozmiaru tablicy[edytuj]

Przyjrzyjmy się nadaniu rozmiaru tablicy przez użycie stałej definiowanej

#define ROZMIAR 3
int main()
{
   int tab[ROZMIAR] = {3,6,8};
}

Innym sposobem jest użycie operatora sizeof do poznania wielkości tablicy. Poniższy kod robi to samo co przedstawiony:

 #include <stdio.h>
 int main()
 {
   int tab[3] = {3,6,8};
   int i;
   printf ("Druk tablicy tab:\n");
 
   for (i=0; i<(sizeof tab / sizeof *tab); ++i) {
     printf ("Element numer %d = %d\n", i, tab[i]);
   }
   return 0;
 }

Powyżej sizeof tab zwraca cały rozmiar pamięciowy tablicy, natomiast sizeof *tab poda nam jaki jest rozmiar typu int (ponieważ takiego typu jest element tablicy, *tab). Dzieląc rozmiar pamięciowy tablicy przez rozmiar pojedynczego elementu uzyskujemy ilość elementów. (Np. przy rozmiarze 44B oraz rozmiarze sizeof(int) równym 4 otrzymujemy, że tablica zawiera 11 elementów.)

Należy pamiętać, że sposób działa tylko dla tablic, a nie wskaźników (mimo że wskaźniki traktujemy w pewnym stopniu podobnie jak tablice).

Pobieranie wartości[edytuj]

Przy odwoływaniu się do konkretnej komórki tablicy, używanym indeksem powinna być liczba, choć istnieje możliwość indeksowania za pomocą np. pojedynczych znaków ('a','b', itp.), jednak w języku C dokonuje się wewnętrzna konwersja takich znaków na liczby im odpowiadające, zatem tablica indeksowana znakami byłaby niepraktyczna i musiałaby mieć odpowiednio większy rozmiar (numerem ASCII dla 'a' jest 97).

Ciekawostki[edytuj]

W pierwszej edycji konkursu IOCCC zwyciężył program napisany w C, który wyglądał dość nietypowo:

 short main[] = {
   277, 04735, -4129, 25, 0, 477, 1019, 0xbef, 0, 12800,
   -113, 21119, 0x52d7, -1006, -7151, 0, 0x4bc, 020004,
   14880, 10541, 2056, 04010, 4548, 3044, -6716, 0x9,
   4407, 6, 5568, 1, -30460, 0, 0x9, 5570, 512, -30419,
   0x7e82, 0760, 6, 0, 4, 02400, 15, 0, 4, 1280, 4, 0,
   4, 0, 0, 0, 0x8, 0, 4, 0, ',', 0, 12, 0, 4, 0, '#',
   0, 020, 0, 4, 0, 30, 0, 026, 0, 0x6176, 120, 25712,
   'p', 072163, 'r', 29303, 29801, 'e'
 };

Co ciekawe - program ten bez przeszkód wykonywał się na komputerach VAX-11 oraz PDP-11. Cały program to po prostu tablica z zawartym wewnątrz kodem maszynowym! Tak naprawdę jest to wykorzystanie pewnych właściwości programu, który ostatecznie produkuje kod maszynowy. Linker (to o nim mowa) nie rozróżnia na dobrą sprawę nazw funkcji od nazw zmiennych, więc bez problemu ustawił punkt wejścia programu na tablicę wartości, w których zapisany był kod maszynowy. Tak przygotowany program został bez problemu wykonany przez komputer.