Pointeri (pokazivači) - objašenjenje

2

Pointeri (pokazivači) - objašenjenje

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Sad tek vidim sta si pisao gore u kodu
char x = '25';
x je tipa char, znaci moze da drzi samo 1 karakter!

U ovom slucaju, kastovanje u uintptr_t radis samo kad hoces da ti ispise adresu promenjljive.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 14 Jul 2012
  • Poruke: 51

Citat:Kad vec vezbas pokazivace preporucio bih ti da radis istovremeno i nizove jer su usko povezani.
Nadji neke proste zadatke i polako resavaj. Ako negde zaglibis ti se javi.

Ево једног питања за које мислим да може бити илустративно када се говори о вези измећу показивача и низова:

Зашто израз x[5]==5[x] има вредност: тачно?



offline
  • Més que un club
  • Glavni vokal @ Harpun
  • Pridružio: 27 Feb 2009
  • Poruke: 3898
  • Gde živiš: Novi Sad,Klisa

Napisano: 07 Okt 2013 21:14

Iz prva kada sam pogledao kod pomislio sam: kako je ovo moguce, i morao sam da istestiram to... I stvarno je vrednost tacno... Jako me zanima odgovor zasto je tako... Gugl mi nije dao neki odgovor Sad

Dopuna: 07 Okt 2013 21:25

Sad sam malo sam cackao i dosao sam na jednu teoriju... te viticaste zagrade ustvari predstavljaju index tj koliko je rastojanje od prvog elementa niza do narednog. Sto bi reklo da je 5[x] isto sto i 5 + x kod pokazivaca. a x[5] je x + 5 i te dve vrednosti su ustvari jednake Very Happy

offline
  • Pridružio: 14 Jul 2012
  • Poruke: 51

Napisano: 07 Okt 2013 22:20

Да, пошто име низа садржи адресу низа - а то је адреса члана x[0], и пошто x+5 не помера за пет бајтова него за пет елемената низа...

x[5] = *(x+5)
5[x] = *(5+x)

Пошто је сабирање показивача као и свако сабирање комутативно *(x+5) = *(5+x),
то је и: x[5] = 5[x] .
Више детаља на страници Stackoverflow.com

Dopuna: 07 Okt 2013 22:31

А пример "ABCD"[2] = 2["ABCD"] = 'C' ?

offline
  • Més que un club
  • Glavni vokal @ Harpun
  • Pridružio: 27 Feb 2009
  • Poruke: 3898
  • Gde živiš: Novi Sad,Klisa

Napisano: 07 Okt 2013 23:10

Meni taj izraz vraca nulu...

Dopuna: 07 Okt 2013 23:12

Mada bi trebalo da je true... Posto se karakter C nalazi na indexu 2...

offline
  • Pridružio: 14 Jul 2012
  • Poruke: 51

Оба израза враћају тачно.

"ABCD"[2] == 2["ABCD"] враћа: тачно.
2["ABCD"] == 'C' враћа: тачно.

Питање је само зашто?

offline
  • Més que un club
  • Glavni vokal @ Harpun
  • Pridružio: 27 Feb 2009
  • Poruke: 3898
  • Gde živiš: Novi Sad,Klisa

Prvi izraz smo vec ustanovili zasto vraca tacno.
A drugi izraz vraca tacno zato se na indexu 2, stringa ABCD, nalazi slovo C.

offline
  • Pridružio: 14 Jul 2012
  • Poruke: 51

У праву си али x[2] = *(x+2) важи за име низа, а рекли смо да оно представља адресу низа.
Да ли је тачно да је и стринг константа "ABCD" адреса?

Што се адреса тиче променљиве се од константи пре свега разликују по месту меморисања.
Константе се меморишу у адресном опсегу који заузимају инструкције извршног фајла.

на пример:
double piStack = 3.14; double *piHeap = new double; *piHeap = piStack;
И piStack и *piHeap се налази баферизиовано негде ван поменутог опсега.
Што можемо и проверити.
printf("%lf %p\n%lf %p\n",piStack, &piStack, *piHeap, piHeap);

Што је адресирано у зеленим пољима која почињу са 002Е и 0067:


Али, где се налазила реална константа 3.14 пре него што је преписана у бафер piStack.
Налазила се у опсегу који заузимају инструкције exe фајла.
Константа 3.14 је неименована, али могли смо је и именовати: #define PI 3.14

или на пример:
#define ZNACI "ABCD" char znakovi[] = ZNACI;
Где се налазе знаци а где знакови? Низ znakovi[] је баферизован ван опсега који заузимају инструкције exe фајла, а симболичка стринг константа ZNACI је уграђена у инструкције.
Што опет можемо проверити:
printf("%s %p\n\n",znakovi, znakovi); printf("%s %p\n",ZNACI, ZNACI);

А, адресирано је у зеленом пољу које почиње са 0029 и плавом пољу са 01245:



Али за разлику од нумеричке константе којој приступамо по вредности, константи типа знаковног низа (стринг константи) приступамо по адреси.
Што се компајлера тиче стринг константа је адреса.

И наравно ни стринг константа не мора бити именована. ZNACI и "ABCD" представљају једну исту стринг константу - једну исту адресу. Симболичка константа свакако губи име пре него што уопште дође до компајлера. (Прочитај следећи Морандов пост - о парсирању текста програма.)
Као што је именована константа ZNACI адреса, тако је и неименована "ABCD" - адреса.

Па кад је адреса онда није чудно што је "ABCD"[2] исто што и 'C' .
И пошто је адреса можемо је доделити неком показивачу char *p; p = "ABCD";
Или скраћено char *p = "ABCD";

Ево комплетног текста програма:
#include<stdio.h> #define ZNACI "ABCD" int main(){    char znakovi[] = ZNACI;    printf("%s %p\n\n",znakovi, znakovi);    printf("%s %p\n",ZNACI, ZNACI);    printf("%s %p\n","ABCD","ABCD");    char *p; p = "ABCD";    char *q = "ABCD";    printf("%s %p\n",p,p);    printf("%s %p\n",q,q);    getchar(); }

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Citat:
Константа 3.14 је неименована, али могли смо је и именовати: #define PI 3.14


To nije "imenovanje" vec samo "search and replace text" instrukcija za parser.

A ovo je potencijalno opasno:
Citat:
char *q = "ABCD";

http://stackoverflow.com/questions/15970171/why-ca.....ar-pointer

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

morando ::
A ovo je potencijalno opasno:
Citat:
char *q = "ABCD";



Ček, ček, jel' to on sam imenovao adresu?

Čitam ove poruke još od juče i ništa mi nije jasno Shocked

Ko je trenutno na forumu
 

Ukupno su 877 korisnika na forumu :: 19 registrovanih, 1 sakriven i 857 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 357magnum, A.R.Chafee.Jr., bbogdan, Boris90, comi_pfc, laki_bb, loon123, Marko Marković, Mixelotti, mrav pesadinac, operniki, procesor, raketaš, repac, S2M, wolverined4, wulfy, yrraf, zdrebac