Vyznam pointeru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vyznam pointeru – C / C++ – Fórum – Programujte.comVyznam pointeru – C / C++ – Fórum – Programujte.com

 

Alan0
Věrný člen
22. 6. 2006   #1
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
PSP user|Web developer|C4D user||Maya Lamer|Photoshop User|Guitar player
Jura_0
Stálý člen
22. 6. 2006   #2
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
some_one0
Návštěvník
23. 6. 2006   #3
-
0
-

Jen doplnim, ze mezi dalsi nejdulezitejsi vlastnosti pointeru je to, ze pomoci nich muzete dynamicky alokovat pamet - bez toho by jen tezko nejaky program mohl vůbec pracovat.

az zije:



void ** ppv_pointer;

:-))

Nahlásit jako SPAM
IP: ...–
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žit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

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

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý