pointer polopate
Moderátori: psichac, Moderátori
pointer polopate
ahojte, mohla by mi nejaka dobra dusa vysvetlit (objasnit) ako vlastne funguju pointre v C a ako ich pouzivat ? som z toho dost vedla, neviem tomu pochopit, takze poprosim uuuuuplne najviac polopate ako sa len da, aj keby ste mali ovocie pouzit
dakujem
dakujem
- bobo87
- Ultimate člen
- Príspevky: 1913
- Dátum registrácie: 15 Feb 2007, 00:00
- Vek: 36
- Kontaktovať používateľa:
Re: pointer polopate
Tak najjednoduchsie - pointer je adresa, ktora hovori, kde je v skutocnosti ulozena nejaka premenna. Napriklad int* je adresa nejakeho intu v pamati. Resp. je to nieco, co mi odkazuje, ze tam niekde v pamati je odlozena hodnota, ktoru hladas.
0
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
- bobo87
- Ultimate člen
- Príspevky: 1913
- Dátum registrácie: 15 Feb 2007, 00:00
- Vek: 36
- Kontaktovať používateľa:
Re: pointer polopate
Pridam aj obrazok. Mriezka su jednotlive pamatove miesta, cierna gulicka je pointer na jedno z nich, napriklad int* a cervena gulicka je pointer na pointer, napriklad int**.
0
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
Re: pointer polopate
no chapem tomu tak ze napr. int *X znamena, ze X ukazuje na nejake pametove miesto typu integer
- bobo87
- Ultimate člen
- Príspevky: 1913
- Dátum registrácie: 15 Feb 2007, 00:00
- Vek: 36
- Kontaktovať používateľa:
Re: pointer polopate
A to je v podstate spravne.
0
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: pointer polopate
Jednoduchá otázka, ťažká odpoveď. Dosť záleží na tom o čom máš v číslicovke predstavu. Skúsim to takto:
Každý procesor má pripojený kus pamäte RAM ktorá je RWM. Takáto pamäť predstavuje tabuľku ktorá má nejaký počet riadkov a berme že každý riadok odsahuje 8bitov. Každý riadok má poradové číslo od 0 do N-1 kde je N je veľkosť pamäte. Toto číslo volajme adresa Predstav si to ako excel sheet s osmimi stĺpcami. Ak chce procesor niečo prečítať alebo zapísať do pamäte tak na to potrebuje zadať adresu toho pamäťového miesta. Je to teda binárne číslo v rozsahu <0 - N-1>. Na vyjadrenie takého čísla je potrebných log2(N). Napríklad ak veľkosť pamäte bude 64kiBy tak na adresu je treba 16bitov.
Adresovanie môže byť buď priame, alebo nepriame. Priame je také že v príkaze pre R/W sa uvedie presná adresa pamäťového miesta kde chceš niečo uložiť alebo prečítať. Takže ak máš takýto kus kódu
prekladač použije priame adresovanie. Niekde v pamäti vyhradí 3 premenné napr. Na adrese 1250 bude suma, 1251 bude cislo1 a 1252 bude cislo2. Dal som to typu char aby to bol iba jeden byte a nekomplikovalo sa to tým že koľko zaberie jeden int v pamäti.
Posledný príkaz sa prevedie na strojové inštrukcie ktoré urobia takéto niečo:
1 vezme sa do procesora byte z adresy 1251
2 vezme sa do procesora byte z adresy 1252
3 spočíta sa to
4 výsledok sa uloží to na adresu 1250
Všetko je super a takýchto výpočtov s premennými môžeš urobiť mraky až sa dopracuješ k úlohe, že spočítaj 100 čísel ktoré sú uložené v pamäti. Ak by si chcel použiť priame adresovanie tak musíš napísať 100 krát to spočítanie. To ale nie je moc elegantné.
Preto majú procesory aj inú možnosť a to je nepriame adresovanie. To je také že sa tam nachádza špeciálny register (alebo viac). Hovorme mu index register. Do tohoto registra môžeš dať adresu a povedať zapíš alebo prečítaj pamäťové miesto ktorého adresa som tam vložil.
Takže ten program na spočítanie 100 čísel by bol takto:
1 nastav počídadlo cyklov na 0
2 nastav suma na 0
3 nastav index register na prve pamäťové miesto
4 vezmi číslo ktoré na adrese ktorá je v index registry
5 pripočítaj číslo k sume
6 posuň index register na nasledujúce pamäťové miesto
7 posuň počítadlo o jednotku
8 ak je počítadlo menej ako 100 chod na bod 4
9 tu mame v suma výsledok
A aby sa schoval ten procesor urobíme teraz C abstrakciu
Operácia *pointer je práve to čo som písal v bode 4. Teda vezmi ten char čo je na adrese ktorá je v premennej pointer.
Sú aj iné úlohy kde sa šikne ukazateľ.
Edit: v tom prvom kóde som opravil mená premenných
Každý procesor má pripojený kus pamäte RAM ktorá je RWM. Takáto pamäť predstavuje tabuľku ktorá má nejaký počet riadkov a berme že každý riadok odsahuje 8bitov. Každý riadok má poradové číslo od 0 do N-1 kde je N je veľkosť pamäte. Toto číslo volajme adresa Predstav si to ako excel sheet s osmimi stĺpcami. Ak chce procesor niečo prečítať alebo zapísať do pamäte tak na to potrebuje zadať adresu toho pamäťového miesta. Je to teda binárne číslo v rozsahu <0 - N-1>. Na vyjadrenie takého čísla je potrebných log2(N). Napríklad ak veľkosť pamäte bude 64kiBy tak na adresu je treba 16bitov.
Adresovanie môže byť buď priame, alebo nepriame. Priame je také že v príkaze pre R/W sa uvedie presná adresa pamäťového miesta kde chceš niečo uložiť alebo prečítať. Takže ak máš takýto kus kódu
Kód: Vybrať všetko
char suma=0;
char cislo1=1;
char cislo2=2;
suma=cislo1+cislo2;
Posledný príkaz sa prevedie na strojové inštrukcie ktoré urobia takéto niečo:
1 vezme sa do procesora byte z adresy 1251
2 vezme sa do procesora byte z adresy 1252
3 spočíta sa to
4 výsledok sa uloží to na adresu 1250
Všetko je super a takýchto výpočtov s premennými môžeš urobiť mraky až sa dopracuješ k úlohe, že spočítaj 100 čísel ktoré sú uložené v pamäti. Ak by si chcel použiť priame adresovanie tak musíš napísať 100 krát to spočítanie. To ale nie je moc elegantné.
Preto majú procesory aj inú možnosť a to je nepriame adresovanie. To je také že sa tam nachádza špeciálny register (alebo viac). Hovorme mu index register. Do tohoto registra môžeš dať adresu a povedať zapíš alebo prečítaj pamäťové miesto ktorého adresa som tam vložil.
Takže ten program na spočítanie 100 čísel by bol takto:
1 nastav počídadlo cyklov na 0
2 nastav suma na 0
3 nastav index register na prve pamäťové miesto
4 vezmi číslo ktoré na adrese ktorá je v index registry
5 pripočítaj číslo k sume
6 posuň index register na nasledujúce pamäťové miesto
7 posuň počítadlo o jednotku
8 ak je počítadlo menej ako 100 chod na bod 4
9 tu mame v suma výsledok
A aby sa schoval ten procesor urobíme teraz C abstrakciu
Kód: Vybrať všetko
char cisla[] = {1,2,3,4};
char suma;
char * pointer;
char i;
suma=0;
for (i=0,pointer=cisla;i<4;i++)
suma+=*pointer++;
Sú aj iné úlohy kde sa šikne ukazateľ.
Edit: v tom prvom kóde som opravil mená premenných
0
Naposledy upravil/-a peterple v 27 Mar 2014, 19:08, upravené celkom 1 krát.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
Re: pointer polopate
nie, ASMko ide mimo mna, citam si ten clanok od peterple uz asi 10x
takze to samotne X je adresa toho pametoveho miesta ktore je typu char ? nakreslil som to ci tomu chapem spravne, cize ja ked napisem int *X; tak nevytvorim premennu typu int s nazvom X, ale zarezervujem pametove miesto v pameti typu int a budem na neho pristupovat cez pismeno X co je vlastne adresa toho miesta ?
Kód: Vybrať všetko
char cisla[] = {1,2,3,4};
char suma;
//char * pointer; premenujem na X aby to bolo prehladnejsie
char *X;
char i;
suma=0;
for (i=0,pointer=cisla;i<4;i++)
suma+=*X++;
- Prílohy
-
- pointer.png (11.77 KiB) 3134 zobrazení
Re: pointer polopate
Ano, ale upresnim:
pamatove miesto X obsahuje adresu pamatoveho miesta char (nemame ho oznacene)
pamatove miesto X obsahuje adresu pamatoveho miesta char (nemame ho oznacene)
0
Re: pointer polopate
ku tomu mojmu obrazku, takze X je tiez nejaky kusok pamete kde je ulozene cislo 2 a cislo 2 je adresou na pametove miesto typu char ?
ked budem mat
char *a ;
char *b;
char *c;
char *d;
tak pismenka a;b;c;d budu nejake kusky pameti v ktorych budu adresy na pametove miesta typu CHAR ? ja tie adresy potrebujem alebo nepotrebujem ? ci mna zaujima iba to ze sa to vola abcd ?
ked budem mat
char *a ;
char *b;
char *c;
char *d;
tak pismenka a;b;c;d budu nejake kusky pameti v ktorych budu adresy na pametove miesta typu CHAR ? ja tie adresy potrebujem alebo nepotrebujem ? ci mna zaujima iba to ze sa to vola abcd ?
Naposledy upravil/-a neznamy v 27 Mar 2014, 13:24, upravené celkom 1 krát.
- lucky62
- Zaslúžilý člen
- Príspevky: 1151
- Dátum registrácie: 14 Feb 2012, 20:16
- Bydlisko: Liptovský Mikuláš, SK
Re: pointer polopate
neviem, či otázka znela ohľadne čistého C alebo aj C++..
aby to nebolo také jednoduché tak v C++ existujú okrem ukazovateľov (pointer) aj odkazy (reference)...
aby to nebolo také jednoduché tak v C++ existujú okrem ukazovateľov (pointer) aj odkazy (reference)...
0
Re: pointer polopate
asi len normalne C, potrebujem to pre pracu s MCU , teda, chcem tomu konecne pochopit a naucit sa to pouzivat preto vas ziadam o pomoc
Re: pointer polopate
Pre vysledny kod vaciny malych MCU je takmer jedno ci pouzijes pointer, alebo pole.
0
Re: pointer polopate
v tejto chvily su tam iba nezmyselne adresy !!!right13 napísal:ked budem mat char *a ;char *b;char *c;char *d;tak pismenka a;b;c;d budu nejake kusky pameti v ktorych budu adresy na pametove miesta typu CHAR ?
0
Re: pointer polopate
Samozrejme, za predpokladu, ze pointer a pole je nieco inexmilos napísal:Pre vysledny kod vaciny malych MCU je takmer jedno ci pouzijes pointer, alebo pole.
Pole defakto v jazyku C neexistuje. Pole je len vyhradene miesto v pamati (velkosti pola), na zaciatok ktoreho ukazuje pointer (meno zhodne s menom pola).
Ak napisem
Kód: Vybrať všetko
unsigned char pole[25];
unsigned char prem;
...
...
prem = pole[10];
Kód: Vybrať všetko
prem = *(pole + 10);
prem = *(10 + pole);
prem = 10[pole];
Kód: Vybrať všetko
prem = pole[10];
0
- Washu
- Power user
- Príspevky: 4521
- Dátum registrácie: 15 Apr 2010, 00:00
- Bydlisko: Multiverse
- Vek: -1999
- Kontaktovať používateľa:
Re: pointer polopate
Si si tymto zapisom isty?
prem = 10[pole];
prem = 10[pole];
0
It doesn't matter how beautiful your theory is, it doesn't matter how smart you are. If it doesn't agree with experiment, it's wrong
(Richard Feynman)
(Richard Feynman)
Re: pointer polopate
Co sa ti na nom nepaci? Vyssie som popisal ako sa v skutocnosti rozlozi na sucet adresy pointera a desiatky, potom sa z nej urobi pointer.
GCC ho spravne prelozi. Nejaky lepsi kompilator nemam poruke.
GCC ho spravne prelozi. Nejaky lepsi kompilator nemam poruke.
0
- scd
- Stály člen
- Príspevky: 150
- Dátum registrácie: 17 Apr 2009, 00:00
- Bydlisko: Dubnica nad Váhom
- Vek: 35
Re: pointer polopate
jaromir to napisal presne.
Názov poľa je v podstate ukazateľ na nultý prvok poľa.
Odporúčam preštudovať http://mff.devnull.cz/pvu/common/cpp.pdf
Je tam krásne do hĺbky vysvetlené všetko ohľadne C a C++. Treba prečítať aj viackrát zasebou
Názov poľa je v podstate ukazateľ na nultý prvok poľa.
Odporúčam preštudovať http://mff.devnull.cz/pvu/common/cpp.pdf
Je tam krásne do hĺbky vysvetlené všetko ohľadne C a C++. Treba prečítať aj viackrát zasebou
0
Keyboard not present. Press ENTER to continue...
Re: pointer polopate
asi mi niekto stoji na vedeni skusim to na dnes nechat tak a zajtra sa k tomu vratim