Zdarec, muzete mi poradit? Ja zaboha nemuzu prijit na vyznam pointeru(ukazatelu). Snad jenom ze mozna nezabiraj tolik pameti, a to je tak asi jediny. Zkousim je teprve tyden, ale zatim si nedokazu predstavit pripad, kdy bych je pouzil. Muzete mi poradit? diky.
Fórum › C / C++
Vyznam pointeru
Al napsal:
Zdarec, muzete mi poradit? Ja zaboha nemuzu prijit na vyznam pointeru(ukazatelu). Snad jenom ze mozna nezabiraj tolik pameti, a to je tak asi jediny. Zkousim je teprve tyden, ale zatim si nedokazu predstavit pripad, kdy bych je pouzil. Muzete mi poradit? diky.
Tohle je pomerne vecne tema. Pokud pracujete v Cecku a doposud jste nepouzival pointery, pak vezte, ze jste zatim neochutil silu jazyka C. A ted uz k tematu. Ukazatele pouzijete vsude tam, kde chcete menit hodnotu lokalni promenne vne funkce(ted nemyslim to, ze si nadeklarujete tuny globalnich promennych). Mno, asi vam to moc nereklo, což Tak dame malicky priklad, v nem se pokusim zmenit hodnotu promenne Prom uvnitr nejake jine funkce - jednou tuto promennou budu predavat hodnotou a jednoupomoci ukazatele(tez odkazem).
#include <stdio.h>
#include <stdlib.h>
void Hodnotou(int p)
{
p = 10;
printf("Uvnitr fce Hodnotou: %dn", p);
} // zde uz prommena p neplati
void Ukazatel(int *p)
{
*p = 10; // dereferencujeme promennou
printf("Uvnitr fce Ukazatel: %dn", *p);// pozor na znak hvezdicky
}
int main(int argc, char *argv[])
{
int Prom = 5; // inicializujeme at vidime, ze se neco deje/nedeje
printf("Pred zavolani Hodnotou: %dn", Prom);
Hodnotou(Prom);
printf("Po zavolani Hodnotou: %dn", Prom); // nejak se nam to nepovedlo v Prom by ted mela byt hodnota 10!!!
printf("Pred zavolani Ukazatel: %dn", Prom);
Ukazatel(&Prom); // Pozor!!! Ampresand
printf("Po zavolani Ukazatel: %dn", Prom); // Parada, povedlo se
system("PAUSE");
return 0;
}
Vystup:
Pred zavolani Hodnotou: 5
Uvnitr fce Hodnotou: 10
Po zavolani Hodnotou: 5
Pred zavolani Ukazatel: 5
Uvnitr fce Ukazatel: 10
Po zavolani Ukazatel: 10
Pokračujte stisknutím libovolné klávesy...
?
A co se stalo? Nejprve je treba si uvedomit, ze ukazatel je obycejna promenna, ovsem jeji hodnouto je adresa promenne, na kterou ukazuje.
V prvnim pripade, kdy volame funkci Hodnotou se na zasobnik(cast pameti kam se ukladaji lokalni promenne) ulozi hodnota promenne Prom, cili 5 do promenne p. Pote ji v tele zmenime na hodnotu 10. Podsud vse v poradku. Ovsem ted nastava ten zvrat, jakmile dojde ukonceni fce Hodnotou vsechny promenne, ktere se ulozily na zasobnik se smazou(a to at to jsou treba i ukazatele) a tudiz se zmena neprojevi na promenne Prom. V druhem pripade je to analogicke, az na to, ze predavame misto hodnoty promenne Prom(5) jeji adresu. No, a na zasobnik se ulozi adresa promenne Prom(respektive se ulozi do p). Jelikoz je to ukazatel, tak se s nim musi nalezite pracovat(to je ta hveydicka a ampresand). Po skonceni behu fce Ukazatel dojde znovu k vyprazdneni zasobniku, tedy i ukazatele p, ale kvuli tomu, ze jsme nepradavali hodnotu ale adresu, tak se nic nestane(obvykle nas adresa promenne nezajima) a tudiz se zmeny projevi i na promenne Prom.
No, je dost pozde a tak nevim, jestli tam nemam prilis chyby, ale jestli ano, tak se tu najde spousta lidi, kteri vam jiste radi pomohou.
Zjistit počet nových příspěvků
Přidej příspěvek
Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 86 hostů
Podobná vlákna
Má význam učit se C# ??? — založil ospaly.stanislav
Význam modifikátorů — založil paul27
Význam IE6 — založil Onsi
Inkrementace pointeru — založil Zelenáč
Nastavení pointeru — založil oxidián
Moderátoři diskuze