
Tak - na začátek bych měl říct, že pole není pole brambor, ale množina
určitého počtu prvků určitého datového typu, ke kterým se dostáváme
indexováním. (index je pořadí prvku od začátku, v c-čku je vždy od
nuly) Hah ! Tak tahle věta byla prkenná jako přejetá parním válcem !
V C/C++ jdou definovat 2 typy polí. Ten první je pole statické - to
znamená, že velikost pole bude známá už při překladu, takové pole
nelze zvětšovat. A potom pole dynamické, to jde zvětšovat a měnit
Ještě než se pustíme do polí, ukážu vám jeden operátor :
10.0 Operátor sizeof
Operátor sizeof slouží ke zjišťování velikosti datových objektů,
vrací hodnotu typu int v Bajtech :
sizeof(char) je 1 // Char je právě 1 bajt ... sizeof(int) je 4 // Tady už se to může trochu lišit, někdy to je 2 sizeof(float) je 32 // To je už poměrně přesné číslo .. sizeof(double) je 64 // .. a tohle ještě víc ! |
int pole[10]; // toto je pole deseti prvků typu int |
pole : array[0 .. 9] of integer; |
Dim pole(0 to 9) As Integer; |
int pole[10] = {5, 8, 12, 5, 4, 6, 58, 0, 72, 1};
|
int pole[] = {5, 8, 12, 5, 4, 6, 58, 0, 72, 1};
|
pole[0] = 10;
pole[9] = 5;
pole[3] = 1;
for(i = 0; i < 10; i ++)
pole[i] = 0; // Tento cyklus vynuluje celé pole
|
pole[10] = 8; |
int pole[3][3]; // pole o devíti prvcích |
int pole[][] = {{5, 8, 4}, {7, 1, 0}, {9, 2, 6}};
// stejně, jako předtím devět prvků, kompilátor si rozměry doplní sám.
|
int pole[3][3]; pole[0][0] = 5; pole[1][0] = 8; pole[2][0] = 4; pole[0][1] = 7; pole[1][1] = 1; pole[2][1] = 0; pole[0][2] = 9; pole[1][2] = 2; pole[2][2] = 6; // stejnej zápis jako minule, jen stokrát delší ;-) |
pole[2][1] = 1;
for(i = 0; i < 3; i ++)
for(j = 0; j < 3; j ++)
pole[i][j] = 0; // vynuluje celé pole
pole[3][0] = 5; // Chyba, překročili jste hranice pole
// Ale u takové chyby (v prvním sloupci) se většinou
// přepíše jen další záznam pole, ale ...
pole[3][3] = 5; // Už sahá někam do paměti, což může
// způsobit pád programu, nebo i Windows (fúj)
|
float pole_floutu[] = {3.1415926, 1.1569847, 0.0000001};
char pole_znaku[] = {'A', 'h', 'o', 'j', ' ', '.', '.', '.' ,0};
// Ta nula je tam velice důležitá, ale o tom až dál ... ale ještě
// je tu jeden pohodlnější způsob :
char druhy_pole_znaku[] = "Ahoj ...";
// Sem už se nula dát nemusí, kompilátor si ji doplní sám.
// Obě dvě pole se tedy doplní samy.
|
pole_a = pole_b; |
int i;
for(i = 0; i < velikost_pole; i ++)
pole_a[i] = pole_b[i];
|
int i; while(pole_a[i] = pole_b[i ++]); // wau ! |
int pole[15], velikost; velikost = sizeof(pole) / sizeof(int); // velikost bude 15 |
printf(pole_znaku); // funguje jen pro pole char, ukončené tou nulou |
printf("Toto je moje prvni pole znaku : \n%s\n"
"A toto je moje druhy pole znaku : \n%s\n",
pole_znaku, druhy_pole_znaku);
|
scanf("%s", pole_znaku);
|
int *poin; |
*poin = 10; // Na adrese poin bylo zapsáno číslo 10 poin[0] = 10; // ten samý zápis, jenže jinak |
point = 0x70; // Kdo by zapomněl, 0x70 je hexadecimální číslo |
float *f, cislo; cislo = 5; // cislo je 5 f = &cislo; // do f byla uložena adresa proměnné cislo *f = 0; // cislo je 0 ! Není to skvělé ? f[0] = 0; // ten samý zápis, ale takhle ! |
#include <malloc.h> |
float *f;
f = (float*) malloc(sizeof(float));
// do f teď můžeme s klidem zapisovat, ale ...
Lepší alternativa :
if((f = (float*) malloc(sizeof(float))) == NULL){
printf("Malo pameti !");
return 0;
} // Funkce malloc totiž v případě neúspěchu vrátí
// makro NULL (NULL = 0x00000000)
|
free((void*)f); |
int *pole_intu;
if((pole_intu = (int*) malloc(10 *sizeof(int))) == NULL)
return 0;
// Teď můžete pracovat s polem, je třeba dbát na hranice polí a
// na to, že v poli jsou náhodné hodnoty, je třeba ho nulovat !
int i;
for(i = 0; i < 10; i ++)
pole_intu[i] = 0;
*pole_intu[0] = 10; // Pole na pozici 0 bude mít hodnotu 10
*(pole_intu + 0) = 20; // Pole na pozici 0 bude mít hodnotu 20
*pole_intu[1] = 100; // Pole na pozici 1 bude mít hodnotu 100
pole_intu ++; // Pole se posune o 1 prvek dopředu (ztratí se adresa 0.)
*pole_intu[1] = 200; // Pole na pozici 2 bude mít hodnotu 200
pole_intu --; // Pole se posune 0 1 prvek zpět (vše je zpátky)
*pole_intu[1] = 0; // Pole na pozici 1 bude mít hodnotu 0
// Při takovýchto hrátkách je třeba dbát na to, aby jsme z pole
// nevyjeli ... Pokud už ste si s polem dost vyhráli, musíme ho
// uvolnit pro další programy ...
free((void*)pole);
// pro free musíme mít přesně stejný pointer, jako vyplivne malloc() !
// takže pozor na hrátky s ++ a -- ! (ono to potom háže chyby)
|
char *pole_znaku;
int pocznaku = 0;
// Zde naalokujeme nějakou paměť, pěkně si pohrajeme ...
// ... a najednou už nám pole nestačí, zvětšíme ho o 10 znaků :
if((pole_znaku = (char*) realloc(pocznaku, (pocznaku + 10) * sizeof(char))) == NULL){
printf("Nedostatek pameti RAM ! Ukonci nekolik programu a zkus to znova.");
return 0;
} // I u realloc může dojít paměť ...
pocznaku += 10;
// Musíme si zapamatovat novou velikost.
|
x = (typ*) malloc(0); |
int **pole, i;
pole = (int**) malloc(10 * sizeof(int*));
// Teď máme naalokovanou první dimenzi pole ...
for(i = 0; i < 10; i ++)
pole[i] = (int*) malloc(10 * sizeof(int));
// A teď už máme naalokované i řádky ...
// Jak jsem psal o polích různých tvarů, tak to se dělá
// právě tady změnou délky řádků ...
|
pole[2][5] = 1; |
pole ++; |
for(i = 0; i < 10; i ++)
free((void*)pole[i]);
// uvolnili sme řádky
free((void*)pole);
// Uvolnili jsme sloupce
|
int *pole[10], pocet = 0;
if((pole = (int*) malloc(8 * sizeof(int))) == NULL) {
printf("Nedostatek pameti RAM !\n");
return;
}
// Teď si můžeme hrát, realokovat, už to snad ani nebudu psát ...
// A tradičně vám ještě řeknu, jak to uvolnit (Masochisti nemusí)
free((void*)pole);
|
char jmeno[] = "Pepa z depa"; |
char *jmeno = "Pepa z depa"; |
int main(int argc, char *argv[])
{
int i;
printf("Program byl spuštěn s %d parametry \n", argc);
for(i = 0; i < argc; i ++)
printf("%s \n", argv[i]);
return 1;
}
|