[Tech] Ancora non va :(
Franco Bagnoli
bagnoli@dma.unifi.it
Mer 9 Giu 2004 15:28:05 CEST
On Wed, 9 Jun 2004, Valerio Montagnani wrote:
> On Wed, 9 Jun 2004 13:27:23 +0200 (CEST)
> "Marco Ermini" <markoer@markoer.org> wrote:
>
> >
> > Valerio, hai presente che lo star (*) significa cose diverse se lo usi per
> > dichiarare una variabile o per indicare il valore puntato da un puntatore
> > giusto?
> >
>
> A questo punto credo di aver confuso anche il mio nome:
>
> * a una variabile mi restituisce il valore contenuto in quella cella di memoria
> * al valore puntato da un puntatore restituisce il valore contenuto nella variabile a cui punta la variabile puntata dal secondo puntatore:
>
> *a contiene 4
>
> *b che punta *a mi rende 4.
>
diciamo:
int a; /* traduzione: è intero quello che sta nella 'cella' chiamata 'a'
*/
a=4; /*a contiene 4*/
Ricorda che la memoria è vista come un grande nastro. 'a' è una maniera di
indicare simbolicamente un indirizzo di memoria. al momento della
compilazione (nei vecchissimi sistemi tipo dos) o al momento di partire al
posto di 'a verrà usata una locazione di memoria, diciamo 12345. Nelle
locazioni 12345, 12346, 12347, 12348 (in int è 4 byte
normalmente)
il programma scrive '4'
int * b; /* trad: è intero quello che è contenuto nella cella il cui
indirizzo sta nella 'cella' chiamata 'b' */
al posto di 'b' verrà sostituito diciamo 3452.
b = &a; /* se ora stampo *b ottengo 4 */
in 3452, 3453, 3454, 3455 viene scritto '12345' (l'insirizzo di a)
a=5; /* se ora stampo *b ottengo 5 */
int *c;
diciamo che 'c' è 3422
c = (int *) malloc(10*sizeof(int));
quando il processore incontra questa istruzione, riserva da qualche parte
10 int, diciamo 6600--6640 (40 bytes), e mette 6600 nelle 4 celle a
partire da c (3422--3425)
c[0] = 1;
il programma traduce in: *(c+0)=1, quindi *(6600)=1 e scrive 1 in
6600-6603
c[5] =2
il programma traduce in: *(c+5)=1, quindi *(6620)=1 e scrive 1 in
6600-6603. Nota che ha sommato 20 e non 5, perché lui sa, grazie alla
dichiarazione, che c è un puntatore a int, quindi ogni volta che deve
incrementare c somma 4.
int ** c; /* è intero quello che è puntato da ciò che è puntato da c */
c = (int **) malloc(5*sizeof(int*));
for (i=0; i<5; i++) {
c[i] = (int *) malloc(10*sizeof(int));
}
c contiene l'indirizzo di una zona di memoria in cui (nei 20 byte
successivi) ci sono 5 numeri. Ognuno di
questi viene interpretato come l'indirizzo di un'altra locazione di
memoria in cui, nei 40 bytes seguenti, ci staranno 10 int.
e così via.
Oppure
c = (int *) malloc (50*sizeof(int));
c contiene l'indirizzo di una zona di memoria in cui, nei 200 byte
successivi, ci staranno 50 int, a te vederli come una matrice.
Questo si può fare anche a più dimensioni,
c[x][y][z] (int *** c)
oppure
c[(x*nx+y)*ny+z] (int *c)
(normalmente in C si scrivono gli indici alla rovescia:
c[z][y][x]
)
--
Franco Bagnoli (franchino) <bagnoli@dma.unifi.it>
virtual location: Dipartimento di Energetica "S. Stecco"
ultra-virtual affiliation: Centro Dinamiche Complesse (CSDC-Firenze)
real location: Dip. Matematica Applicata "G. Sansone", Universita' Firenze,
Via S. Marta, 3 I-50139 Firenze, Italy. Tel. +39 0554796422, fax: +39 055471787
Maggiori informazioni sulla lista
flug-tech