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.gifUvaž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]