Veľkonočná akcia je tu a s ňou aj extra kredity ZADARMO na náš interaktívny e-learning. Dobij si teraz kredity a posuň sa vo svojej kariére vpred!
Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – 1. diel - Úvod do ukazovateľov v C ++

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Štefan Smrek:9. marca 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?

 
Odpovedať
9. marca 20:57
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Štefan Smrek
DarkCoder:9. marca 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.

Odpovedať
9. marca 21:30
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá na DarkCoder
Štefan Smrek:9. marca 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.

 
Odpovedať
9. marca 21:45
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Štefan Smrek
DarkCoder:9. marca 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.

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

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

 
Odpovedať
9. marca 22:14
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 5 správy z 25.