pointer polopate

C,C++,C#

Moderátori: psichac, Moderátori

neznamy

pointer polopate

Príspevok od používateľa neznamy » 26 Mar 2014, 22:02

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 :D

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: pointer polopate

Príspevok od používateľa bobo87 » 26 Mar 2014, 22:09

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;}}

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: pointer polopate

Príspevok od používateľa bobo87 » 26 Mar 2014, 22:14

Pridam aj obrazok. :D Mriezka su jednotlive pamatove miesta, cierna gulicka je pointer na jedno z nich, napriklad int* a cervena gulicka je pointer na pointer, napriklad int**.
Prílohy
pointer.png
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;}}

neznamy

Re: pointer polopate

Príspevok od používateľa neznamy » 26 Mar 2014, 23:08

no chapem tomu tak ze napr. int *X znamena, ze X ukazuje na nejake pametove miesto typu integer

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: pointer polopate

Príspevok od používateľa bobo87 » 26 Mar 2014, 23:09

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;}}

peterple
Ultimate člen
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

Príspevok od používateľa peterple » 26 Mar 2014, 23:41

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

Kód: Vybrať všetko

char suma=0;
char cislo1=1;
char cislo2=2;

suma=cislo1+cislo2;
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

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++;

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
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í.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: pointer polopate

Príspevok od používateľa xmilos » 27 Mar 2014, 06:25

Ak rozumies ASM, mrkni co robi prekladac, mozna ti to skor napovie.
0

neznamy

Re: pointer polopate

Príspevok od používateľa neznamy » 27 Mar 2014, 13:11

nie, ASMko ide mimo mna, citam si ten clanok od peterple uz asi 10x

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++;

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 ?
Prílohy
pointer.png
pointer.png (11.77 KiB) 3144 zobrazení

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: pointer polopate

Príspevok od používateľa xmilos » 27 Mar 2014, 13:18

Ano, ale upresnim:

pamatove miesto X obsahuje adresu pamatoveho miesta char (nemame ho oznacene)
0

neznamy

Re: pointer polopate

Príspevok od používateľa neznamy » 27 Mar 2014, 13:21

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 ?
Naposledy upravil/-a neznamy v 27 Mar 2014, 13:24, upravené celkom 1 krát.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: pointer polopate

Príspevok od používateľa xmilos » 27 Mar 2014, 13:22

Presne
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: pointer polopate

Príspevok od používateľa lucky62 » 27 Mar 2014, 13:44

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)... :-)
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

neznamy

Re: pointer polopate

Príspevok od používateľa neznamy » 27 Mar 2014, 13:48

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 ;)

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: pointer polopate

Príspevok od používateľa xmilos » 27 Mar 2014, 13:50

Pre vysledny kod vaciny malych MCU je takmer jedno ci pouzijes pointer, alebo pole.
0

Používateľov profilový obrázok
petersno
Ultimate člen
Ultimate člen
Príspevky: 2774
Dátum registrácie: 06 Aug 2011, 00:00
Bydlisko: ba
Vek: 63

Re: pointer polopate

Príspevok od používateľa petersno » 27 Mar 2014, 14:01

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 ?
v tejto chvily su tam iba nezmyselne adresy !!!
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: pointer polopate

Príspevok od používateľa jaromir » 27 Mar 2014, 14:40

xmilos napísal:Pre vysledny kod vaciny malych MCU je takmer jedno ci pouzijes pointer, alebo pole.
Samozrejme, za predpokladu, ze pointer a pole je nieco ine :)

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];
je to to iste ako keby som napisal niektory z tychto troch zapisov

Kód: Vybrať všetko

prem = *(pole + 10);
prem = *(10 + pole);
prem = 10[pole];
Ten prvy je v skutocnosti to, co sa deje ak niekde napisem

Kód: Vybrať všetko

prem =  pole[10];
0

Používateľov profilový obrázok
Washu
Power user
Power user
Príspevky: 4521
Dátum registrácie: 15 Apr 2010, 00:00
Bydlisko: Multiverse
Vek: -1998
Kontaktovať používateľa:

Re: pointer polopate

Príspevok od používateľa Washu » 27 Mar 2014, 14:44

Si si tymto zapisom isty?
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)

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: pointer polopate

Príspevok od používateľa jaromir » 27 Mar 2014, 14:48

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.
0

Používateľov profilový obrázok
scd
Stály člen
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

Príspevok od používateľa scd » 27 Mar 2014, 15:33

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 :wink:
0
Keyboard not present. Press ENTER to continue...

neznamy

Re: pointer polopate

Príspevok od používateľa neznamy » 27 Mar 2014, 15:36

asi mi niekto stoji na vedeni :( skusim to na dnes nechat tak a zajtra sa k tomu vratim

Napísať odpoveď