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

Dodane 144 bajty ,  1 rok temu
brak opisu edycji
m (→‎binarnego: link)
Nie podano opisu zmian
== Deklaracja tablic ==
Deklarując [[C/Tablice|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.
<sourcesyntaxhighlight lang="c">
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) */
</syntaxhighlight>
</source>
 
Możemy to stosować również przy deklaracji tablicach bez podanego rozmiaru:
<sourcesyntaxhighlight lang="c">
int tablica[] = {0, [3]3, 4}; // tablica 5-elementowa
</syntaxhighlight>
</source>
 
Jak i przy deklaracji tablic wielowymiarowych:
<sourcesyntaxhighlight lang="c">
float macierz[4][5] = {
{ 1.6, [2]2.4, 5.6 }, /* pierwszy wiersz */
{ 8.8, 7.5, } /* piąty wiersz */
};
</syntaxhighlight>
</source>
 
== Definiowanie rozmiaru tablicy ==
Przyjrzyjmy się nadaniu rozmiaru tablicy przez użycie stałej definiowanej
 
<sourcesyntaxhighlight lang="c">
#define ROZMIAR 3
int main()
int tab[ROZMIAR] = {3,6,8};
}
</syntaxhighlight>
</source>
 
{{infobox|W pierwotnym standardzie języka C rozmiar tablicy nie mógł być określany przez zmienną lub nawet stałą zadeklarowaną przy użyciu [[C/Zmienne#Stałe|słowa kluczowego const]]. Dopiero w późniejszej wersji standardu (tzw. C99) dopuszczono taką możliwość. Dlatego do deklarowania rozmiaru tablic często używa się dyrektywy preprocesora [[C/Preprocesor##define|#define]]. Powinni na to zwrócić uwagę zwłaszcza [[C++/Różnice między C a C++|programiści C++]], gdyż tam zawsze możliwe były oba sposoby.}}
 
Innym sposobem jest użycie operatora <tt>sizeof</tt> do poznania wielkości tablicy. Poniższy kod robi to samo co przedstawiony:
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
int main()
return 0;
}
</syntaxhighlight>
</source>
 
Powyżej <tt>sizeof tab</tt> zwraca cały rozmiar pamięciowy tablicy, natomiast <tt>sizeof *tab</tt> poda nam jaki jest rozmiar typu <tt>int</tt> (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.)
== Ciekawostki ==
W pierwszej edycji konkursu [[w:IOCCC|IOCCC]] zwyciężył program napisany w C, który wyglądał dość nietypowo:
<sourcesyntaxhighlight lang="c">
short main[] = {
277, 04735, -4129, 25, 0, 477, 1019, 0xbef, 0, 12800,
'p', 072163, 'r', 29303, 29801, 'e'
};
</syntaxhighlight>
</source>
Co ciekawe - program ten bez przeszkód wykonywał się na komputerach [[w:en:VAX|VAX]]-11 oraz [[w:PDP|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.
 
 
 
<sourcesyntaxhighlight lang=c>
 
 
 
</syntaxhighlight>
</source>
 
 
Wynik :
 
<sourcesyntaxhighlight lang=bash>
 
 
i = 2 b[i] = 1.350000
 
</syntaxhighlight>
</source>