Newsgroup: it.comp.lang.c
Titolo: array bidimensionale vs array monodimensionale

int a[10][20];    /* vettore bidimensionale*/
int *b[10];         /* vettore di puntatori     */
Ha senso chiedersi quale intero sara' contenuto in a[3][2].
Perche' ha, parimenti senso, chiedersi quale elemento sara' contenuto in
b[3][4] ?
Immagino che il mio vettore di puntatori, punti a randomici elementi
contenuti in a.
   ________________________________________
  | &a[2][5] | &a[3][3] | &a[4][3] | &a[9][1]....           |
  |________|________|_______ |_______________|
        b[0]           b[1]            b[2]             b[3].....
ho, quindi, di volta in volta assegnato
b[0]  = &a[2][5];
b[1] = &a[3][3];
.........
b per me e' un array monodimensionale, non una array bidimensionale.
Avra' senso chiedersi, cosa conterra', ad esempio b[1].... ma come intendo
b[3][4] ?
Le mie domande scaturiscono da una problematica interpretazione del K & R:
A pag 144 (par.5.9) leggo:
"Assumendo che ogni elemento di  b punti ad un vettore di 20 elementi, b
stesso occupera' 200 locazioni di
ampiezza pari ad un int, piu' dieci celle per i puntatori".
..come al solito.. Grazie ^_^


-- 
Cordiali saluti
  Artemio

 ampiezza pari ad un int, piu' dieci celle per i puntatori".
20 (numero di puntatori) x 
10 (numero di elementi puntati da ciascun puntatore) =
200 +
10 (puntatori)
Quindi, in totale, la memoria occupata con l'utilizzo di b e'
200 * sizeof(int) + 10 * sizeof(int*)
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

b è un vettore di puntatori a caratteri.
Certo:   int *b[10];         


 10 (numero di elementi puntati da ciascun puntatore) =
ovviamente 10 e 20 vanno invertiti.


 b[i][j] == a[i][j]
il mio problema e' che non capisco perche' se dichiaro un vettore
monodimensionale
di puntatori
int *b[10];
poi lo gestisco cosi'
b[i][j]
cioe' come un bidimensionale
e non
b[i]
Grazie mille
    Leonardo


Andrea scusami,
e' un po che guardo il disegno,
ma non riesco a capire quello che mi vuoi dire,
potresti, perfavore, essere un po piu' chiaro?
Non capisco il perche' degli indici
b[3] ----> [-1]     [ 2]     [ 3]     [ 6]     [ 1]
ma capisco che b[3][4] e' il
5^ elemento presente nella zona di memoria puntata da b[3].
Non capisco come da
int *b[10];
arrivi a
b[i][j]
e non a
b[i]
Grazie per l'aiuto.

   *(x + y)
Perciò nel nostro caso sarà
b[i] come *(b + i)
b[i][j] come *(*(b + i) + j)
La valutazione di [] va da sinistra a destra.
Prima ti posizioni su b[i], e poi sul suo elemento j-esimo
Puoi leggerlo sul K&R nell'appendice A 8.6.2, a pag. 264 
-- 
Cordiali saluti
  Artemio

b[1] = &a[0][1];
Volevi dire
b[1] = &a[1][0]  ?
&a[1][0] è il puntatore al primo elemento della seconda riga della
matrice a, mentre &a[0][1] è il puntatore al secondo elemento della
prima riga.
Comunque in questo caso specifico entrambe le assegnazioni vanno bene,
ora provo a spiegarti il motivo.
Cerco di usare la terminologia in uso nel NG.
a[1] e &a[1][0] puntano allo stesso indirizzo, ma rappresentano due
tipi diversi:
a[1] è un puntatore ad un *vettore* di int
&a[1][0] è un puntatore al primo elemento del vettore a[1]
Prova a stampare
printf("%d, %d", sizeof(a[0]), sizeof(&a[0][0]));
e vedrai che la loro dimensione non sarà la stessa.
La dimensione di a[0] sarà N volte maggiore di quella di &a[0][0],
dove N è il numero di elementi di una colonna.
b[i] è un puntatore ad un *singolo* int.
Per poter assegnare b[i] = a[j], il puntatore a[j] decade al suo primo
elemento, vale a dire ad &a[j][0].
Nel caso di a[1] decade a &a[1][0].
In questo caso perciò scrivendo
b[0] = a[0];
b[0] = &a[0][0];
otterrai lo stesso risultato, visto che a[0] viene fatto decadere.
a[0] e &a[0][0] non sono però in generale equivalenti, come puoi
leggere dal thread 'decadenza di un array' (tralasciando la flame).
-- 
Cordiali saluti
  Artemio

b[i]
Per lo stesso motivo per cui, se scrivi:
char *p;
p = malloc(10);
puoi scrivere:
p[5]
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

dove N è il numero di elementi di una colonna.
Sorry... N è il numero di elementi di una *riga*. :-) Comunque credo
che tu mi abbia capito lo stesso, vero?
-- 
Cordiali saluti
  Artemio

 --
Si.
Grazie mille.
    Leonardo