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: 3896
  • 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: 3896
  • 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: 3896
  • 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: 4534

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 739 korisnika na forumu :: 51 registrovanih, 5 sakrivenih i 683 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, _Sale, A.R.Chafee.Jr., adelita, aramis s, Atomski čoban, babaroga, bankulen, Boris90, brufen, Cigi, dac, danilopu, Denaya, Djokkinen, dolinalima, draganca, Drug pukovnik, ekser222, goxin, GreenMan, hartman, hatman, havoc995, hyla, ivan1973, Krusarac, kybonacci, liman, LUDI, MB120mm, Miskohd, Mixelotti, MrNo, naki011, nenad81, nuke92, Oluj2.1, pein, Recce, rovac, royst33, sakota79, Smiljke, Snorks, Srki98, ssekir75, VES 11119, virked, vlvl, |_MeD_|