C-ben mi történik, hogyha egy tömbhöz +1-et hozzáadunk?
A feladat lényege, hogy egy double méretét kell <u>kiszámolni</u> pointerekkel és + - * felahsználásával.
Ezt a megoldást találtam google-ön:
/*
* Return the size of a double in bytes.
*/
int doubleSize() {
double doubleArray[10];
double * a = doubleArray;
double * b = doubleArray + 1;
return (int) b - (int) a;
}
Hova adja hozzá azt a plusz egyet? Miért ad jó eredményt ez a kód?
C-ben a tömb implicit, kussban és minden további nélkül alakul át pointerré. A tömb neve a tömb első (0. indexű) elemére mutató pointerré alakul.
További tények: a pointeraritmetika szerint ha egy pointerhez hozzáadsz valamennyit (vagy kivonsz belőle), mondjuk N-t, akkor N * sizeof(mutatótt típus)-nyi bájtot (chart) ugrik, mert feltételezi, hogy egy tömbbe mutat a mutató, és ebben mozogsz, és akkor nincs értelme két elem határa közé mutatni.
Ez a sor viszont meglehetősen fordítófüggő, hogy működik-e, arra támaszkodik, hogy a pointerek mérete nem nagyobb, mint az int típus, és hogy gond nélkül lehet konvertálni intté. Mindenesetre ha feltételezzük, hogy sizeof(void*) == sizeof(int), és hogy sizeof(char) az pont 1 bájt, akkor ez a kivonás épp a doubleArray 0. és 1. elemének a címe közti különbséget adja vissza, és mivel tömbben folytonosan, hézag nélkül helyezkednek el az elemek, ezért ez épp a 0. elem mérete.
return (int) b - (int) a;
Nem adsz hozzá a tömbhöz egyet. Ha megnézed, a és b típusa double*, tehát egy double-re mutató pointer. A tömb szintén egy mutató a megfelelő típusra. A mutatók int típusú számok, a memóriacímekre mutatnak. Viszont maga a pointer nem 1-el fog nőni. Amikor tömbre mutató pointert növelsz i-vel (lehet, hogy egyébként is - ezt most nem tudom), akkor lényegében a következő utasítás fut, ha T típusú elemekre mutatott a tömbpointer:
p=p+i*sizeOf(T);
Egy jobban látható példán, a megjegyzésben írt számok csak példaként szolgálnak:
int t[10]; // t=1
int* a=t; // a=1
int* b=t+1; // b=t+sizeOf(int)=5
return (int)b-(int)a; // 4
"A tömb szintén egy mutató a megfelelő típusra."
Nem, nem, nem. Ezt felejtsük el. A tömb tömb, a mutató meg mutató. Mint említettem, a tömb gond nélkül konvertálódik pointerré, de ő maga akkor is tömb marad.
"A mutatók int típusú számok, a memóriacímekre mutatnak."
Nem, nem, nem. A mutatók nem int típusú számok. A mutatók mutatók. Nem véletlenül nem alakulnak át intté automatikusan. Próbál meg pl 64 bites Visual C++ fordítóval, a mutatók 64 bitesek, az intek meg 32, nem is férne el benne.
Szóval mégegyszer: a mutató NEM integer. Nem hordozható semmilyen megoldás, ami intként kezeli őket.
"lényegében a következő utasítás fut"
Itt csak finom kijavítás, hogy az nem utasítás, hanem kifejezés.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!