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

Usunięta treść Dodana treść
Lethern (dyskusja | edycje)
wycięto z C/Tablice, dodano edycje m.in. użytkownika 93.181.142.98 i uzupełniono / sklejono w całoś
 
Lethern (dyskusja | edycje)
przeniesiono część z C/Tablice, uzupełniono
Linia 1:
== Deklaracja tablic ==
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.
<source lang="c">
Linia 19 ⟶ 20:
};
</source>
 
== Definiowanie rozmiaru tablicy ==
Przyjrzyjmy się nadaniu rozmiaru tablicy przez użycie stałej definiowanej
 
<source lang="c">
#define ROZMIAR 3
int main()
{
int tab[ROZMIAR] = {3,6,8};
}
</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 sizeof do poznania wielkości tablicy. Poniższy kod robi to samo co przedstawiony:
<source lang="c">
#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;
}
</source>
 
Należy pamiętać, że działa on tylko dla tablic, a nie wskaźników (jak później się dowiesz wskaźnik też można w pewnym stopniu traktować jak tablicę).
 
== Pobieranie wartości ==
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 ==
W pierwszej edycji konkursu [[w:IOCCC|IOCCC]] zwyciężył program napisany w C, który wyglądał dość nietypowo:
<source lang="c">
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'
};
</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.