Kezdőoldal » Számítástechnika » Programozás » C-ben mi történik, hogyha egy...

C-ben mi történik, hogyha egy tömbhöz +1-et hozzáadunk?

Figyelt kérdés

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?



2013. ápr. 30. 19:23
 1/5 iostream ***** válasza:
90%

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;

2013. ápr. 30. 19:41
Hasznos számodra ez a válasz?
 2/5 zsomkovacs ***** válasza:
41%

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

2013. ápr. 30. 19:41
Hasznos számodra ez a válasz?
 3/5 A kérdező kommentje:
Köszönöm, hogy segítettetek megérteni!
2013. ápr. 30. 19:50
 4/5 iostream ***** válasza:
80%

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

2013. ápr. 30. 20:25
Hasznos számodra ez a válasz?
 5/5 zsomkovacs ***** válasza:
Utánanéztem, valóban úgy van, ahogy leírtad, köszönöm a helyreigazítást. Az a szomorú, hogy ezeket egyetemen tanultam, és még csak fel sem merült, hogy az array implicit konvertálódna...
2013. máj. 1. 07:29
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!