9.  Ukazovatele a polia

9.7  Precvičme si

  Napíšte dve rôzne funkcie, ktoré dynamicky alokujú pamäť pre pole n int-ov a vrátia pointer na začiatok tohto poľa.

[Riešenie]

  Napíšte funkciu, ktoré dynamicky alokuje pamäť pre dvojrozmerné pole prvkov typu double, ktoré bude mať x riadkov a y stĺpcov. Funkcia vráti pointer na začiatok tohto dvojrozmerného poľa.

[Riešenie]

  Uveďte dva rôzne spôsoby, ktorými sa dá sprístupniť druhý prvok takto deklarovaného poľa:

int a[5];

[Riešenie]

problem.gif  Uvažujme dve polia, jedno statické, druhé dynamické:

int x[10], *p_x;
p_x = (int*)malloc(10*sizeof(int));

Aký je rozdiel medzi  sizeof(x)  a  sizeof(p_x)

[Riešenie]

  Opravte chyby v nasledujúcom programe:

int main(void)
{
   double *p = malloc(3*sizeof(double));
   p = p + 3;
   *p = 3.14;
   printf("%f", *p);
   return(0);
} 
[Riešenie]

  Reťazec je špeciálny prípad jednorozmerného poľa, ktoré je zložené z prvkov typu char. Pracuje sa s ním úplne rovnako ako s ktorýmkoľvek iným poľom. Jediná odlišnosť, ktorú musíme mať napamäti je fakt, že reťazec je vždy ukončený znakom '\0'. Pri alokovaní pamäte pre reťazec sa musí preto alokovať o 1 bajt naviac. Reťazec môže mať ľubovolnú dĺžku, treba si však uvedomiť, že štandardné spracovanie reťazca (pomocou štandardných funkcií - pozri string.h) končí vždy dosiahnutím prvého znaku '\0'. Samozrejme, ak s reťazcom pracujeme ako s poľom prvkov typu char, môžeme pomocou indexu sprístupniť všetky znaky. Pri práci s reťacom sa môžete stretnúť s uvedenými zápismi, objasnite rozdiel medzi nimi:

a)  char s1[10];
b)  char *s2 = (char*) malloc(10);
c)  char s3[] = "Ahoj";
d)  char *s4 = "Nazdar";

[Riešenie]

  Čo bude výsledkom tohto programu?

int main(void)
{
   char *p;
   for (p = "VIP"; *p;  p++) printf("%c", *p - 1); 
   printf("\n");
   return(0);
} 
[Riešenie]

  Funkcia main môže mať, aj keď doposiaľ ste na to neboli asi zvyknutí, formálne parametre a to jeden príp. dva - tie sú väčšinou pomenované argc, argv (je to "céčkovská" tradícia :-). Ich úlohou je odovzdať do progamu argumenty zo vstupného príkazového riadku, čiže parametre, s ktorými bol program spustený. Funkcia main môže mať teda hlavičku:

int main (int argc, char *argv[])
resp.
int main (int argc, char **argv)

V oboch prípadoch argc znamená počet reťazcov na príkazovom riadku a argv je pole pointerov na reťazce (dvojrozmerné pole s riadkami rôznej dĺžky).

Napr. ak program pokus.exe spustíme z príkazového riadku takto:

pokus parameter1 parameter2

tak potom:

argc == 3
argv[0] == "pokus"
argv[1] == "parameter1"
argv[2] == "parameter2"

Napíšte program, ktorý prečíta parametre z príkazového riadku a vypíše ich na obrazovku.

[Riešenie]