Poslao: 02 Maj 2013 14:21
|
offline
- morando
- Građanin
- 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.
|
|
Poslao: 07 Okt 2013 20:43
|
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] има вредност: тачно?
|
|
|
|
|
Poslao: 07 Okt 2013 22:31
|
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' ?
|
|
|
|
Poslao: 07 Okt 2013 23:12
|
offline
- NIx Car
- Legendarni građanin
- 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...
|
|
|
|
Poslao: 08 Okt 2013 16:33
|
offline
- Pridružio: 14 Jul 2012
- Poruke: 51
|
Оба израза враћају тачно.
"ABCD"[2] == 2["ABCD"] враћа: тачно.
2["ABCD"] == 'C' враћа: тачно.
Питање је само зашто?
|
|
|
|
Poslao: 08 Okt 2013 17:52
|
offline
- NIx Car
- Legendarni građanin
- 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.
|
|
|
|
Poslao: 08 Okt 2013 22:04
|
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();
}
|
|
|
|
|
Poslao: 08 Okt 2013 23:19
|
offline
- E.L.I.T.E.
- Legendarni građanin
- 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
|
|
|
|