NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.

Diskuze – Lekce 1 - Úvod do ukazatelů v C++

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Štefan Smrek:9. března 20:57

V súvislosti s predávaním poľa ako argumentu(para­metru) funkcie, sa chcem opýtať:

Máme nejaké pole čísel v hlavnej funkcii main(), napr:

#include <iostream>

void vynuluj_pole(int cisla[])
{
    cout << sizeof(cisla) << endl;  // tu to dá nesprávny výsledok 8 bajtov,
                                    // prečo ?
    ...
}

int main(void)
{
    int pole[] = {1,2,3,4,5};
    cout << sizeof(pole) << endl;  // tu to dá správnu hodnotu 20 bajtov
    vynuluj_pole(pole);
    return 0;
}

Prečo v hlavnej funkcii main() funkcia sizeof() funguje správne, ale vo volanej funkcii
vynuluj_pole() už nie? Veď v obidvoch prípadoch má ako argument to isté pole.
A názov poľa je vlastne pointer na to pole. Čiže v obidvoch prípadoch má funkcia sizeof()
ako argument pointer na pole cisel. Čo sa zmenilo? Prečo dáva iné výsledky?

 
Odpovědět
9. března 20:57
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Štefan Smrek
DarkCoder:9. března 21:30

sizeof není funkce ale operátor preprocesoru.

Ve funkci main() vrátí sizeof(pole) velikost celého pole v bajtech, 5 * 4 bajtů = 20 bajtů.
Ve funkci vynuluju_pole() vrátí velikost ukazatele (obvykle 8 bajtů na 64bit systémech)

Pokud potřebuješ znát velikost pole uvnitř funkce, musíš ji předat jako další parametr.

Odpovědět
9. března 21:30
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Štefan Smrek:9. března 21:45

Ďakujem za odpoveď a rýchlu reakciu. Tak nejak som tušil, že to tak bude.
I keď stále nechápem, prečo operátor sizeof() vo funkcii vynuluj_pole()
nevie vrátiť veľkosť poľa, ale v hlavnej funkcii main() to vie.

 
Odpovědět
9. března 21:45
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Štefan Smrek
DarkCoder:9. března 21:56

Operátor sizeof vrátí velikost pole pouze tedy, když je pole deklarované ve stejném rozsahu, v jakém se používá. Když se pole předává jako argument funkce, stáva se z něho ukazatel a sizeof vrátí velikost tohoto ukazatele, ale ne velikost původního pole.

Odpovědět
9. března 21:56
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Štefan Smrek:9. března 22:14

Veľmi pekne ďakujem. Takže podmienkou je rovnaký rozsah platnosti.
Hm, to by ma nenapadlo.

 
Odpovědět
9. března 22:14
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 25.