[Tech] Ancora non va :(
Valerio Montagnani
tech@vmontagnani.it
Mer 9 Giu 2004 15:36:28 CEST
On Wed, 9 Jun 2004 15:28:05 +0200 (CEST)
Franco Bagnoli <bagnoli@dma.unifi.it> wrote:
Grazie Franco. E' molto chiara la tua spiegazione. Ora la stampo anche :)
Vale
> 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
>
> _______________________________________________
> FLUG - Discussioni tecniche - tech@firenze.linux.it
> URL: http://lists.firenze.linux.it/mailman/listinfo/tech
> Archivio: http://lists.firenze.linux.it/pipermail/tech
> Ricerca nell'archivio: http://www.firenze.linux.it/search
--
Valerio Montagnani (Lug-Account) <tech@vmontagnani.it>
pub 1024/C7E4BC57 sub 2048g/0E170155
Key fingerprint = D5A4 EDFC 060C 5BD6 E2DD 8252 3B67 C1EB C7E4 BC57
Maggiori informazioni sulla lista
flug-tech