Newsgroup: it.comp.lang.c++
Titolo: Puntatore ad array

Salve a tutti. Io so che posso utilizzare un puntatore per accedere ad
un array, facendo tipo:
int array[5];
int *p_array = array;
dato che appunto array senza indice mi restituisce l'indirizzo di
memoria. Davo per scontato che la cosa funzionasse anche nel caso
multisimensionale, tipo:
int array[5][5];
int *p_array = array;
ma provando ho visto che in realtà non è così. Il compilatore non è
d'accordo con me :). Ora, quello che mi viene in mente di ovvio è
creare array di puntatori, ma non è che per caso ci sia qualche sistema
più comodo? Su tutti i libri dove ho letto non ho trovato questi casi,
ma solo puntatori ad array monodimensionali.
Grazie per qualsiasi informazione, ciao!

Luca ha scritto:

ciao, io ho avuto lo stesso problema l'altro giorno, ossia dovevo 
passare un puntatore ad un array bidimensionale ad una funzione, e l'ho 
risolto creando una struttura con dentro l'array.
struct MiaStruttura
{
	int array[5][5];
};
Alla funzione ho passato il puntatore alla struttura.
Se la tua esigenza è la medesima, potresti risolvere in questo modo, 
nell'attesa che magari qualcuno del NG ci illumini, se non altro a 
questo punto sono curioso di sapere se ci sono altri metodi migliori o 
più "ortodossi".
Saluti

 int *p_array = array;
Stai attento: array di interi, puntatore ad array di interi e
puntatore ad intero sono tre cose molto diverse. Nel caso specifico,
tu hai un *decadimento* del nome dell'array in puntatore al primo
elemento e questo accade a meno di tre casi specifici (l'uso
dell'operatore address-of &, l'inizializzazione di un array mediante
uno string literal e l'uso di sizeof). Nel tuo caso, non applicandosi
le eccezioni di cui sopra, il decadimento esiste. In realtà, il tipo
giusto per il puntatore all'array specifico dovrebbe essere:
typedef int (*arrayptr)[5];
...
arrayptr p = &array;

 int *p_array = array;
Se vuoi un puntatore al primo elemento puoi scrivere:
	&array[0][0];
ma un puntatore ad un array bi-dimensionale non è molto utile se non sai 
qual'è la dimensione della righe...
E.

 sai qual'è la dimensione della righe...
E difatti lo avevo provato, solo che ottengo questo errore:
prova.c: In function ?int main()?:
prova.c:13: error: invalid types ?int[int]? for array subscript
quando provo ad utilizzare gli indici per accedere agli elementi:
p_array[0][0] = 4;
per cui suppongo non si possa fare.

 arrayptr p = &array;
Sai, anche dopo aver studiato questo typedef non colgo bene la
differenza. Comunque mi pare che il comportamente sia quello che
desideravo.

 Saluti
Orca... mi sa che ad occhio si, questa è una soluzione migliore della
mia! Se non ne trovo altre penso che adotterò questa.
Grazie mille!

 Grazie per qualsiasi informazione, ciao!
Usa std::vector<std::vector<int> > e non pensarci (quasi) piu'. In
alternativa puoi definire array come
int array[5*5]
e smazzarti tu gli indici, oppure definire una classe matrice, oppure
cercare una classe matrice gia' fatta, ecc. ecc.
Ciao,
Nicola

 più "ortodossi".
Dovrei aver trovato la soluzione su C++ Primer:
int array[2][2];
int (*p_array)[2] = array;
p_array[0][1] = 3;
questo non da più errori e sembra funzionare, la spiegazione c'è sul
libro. Mi parrebbe proprio funzionare così, e probabilmente la
soluzione è sostanzialmente la stessa data da nmusatti, solo senza
usare typedef.
Ciao e grazie a tutti!

mia! Se non ne trovo altre penso che adotterò questa.
La soluzione migliore è quella che usa un puntatore ad array. La
soluzione di cui sopra è solo un work-around, abbastanza inutile se si
vuol passare un array ad una funzione, visto che il nome di un array,
per quel che riguarda i parametri formali, decade sempre in puntatore
al primo elemento.

differenza. 
La differenza tra cosa?
Una cosa è un array, una cosa è un puntatore, una cosa è un puntatore
ad array.

 ad array.
Ah, no no, tra tutti questi mi è chiara. E' l'utilizzo di typedef in
quel caso che non mi convince del tutto. Non mi era molto chiara la
differenza tra il codice riportato da me e l'uso di typedef.

 al primo elemento.
Ma in effetti anche questo non mi è chiaro... cioè, a me proprio quello
serviva, un riferimento al primo elemento dell'array, e mi pareva che
fosse semplice come nel caso di un vettore... però semplicemente poi
l'uso degli indici non funzionava più. Facendo così invece funziona, e
devo dire che sto ancora cercando bene di capire il perché, ma conto di
arrivarci prima o dopo :).


...perché quello che hai ottenuto è un array ad una singola entrata...
quindi dovresti utilizzarlo così:
p_array[i*5+j]=17
per accedere all'elemento [i][j]
E.

quel caso che non mi convince del tutto. 
"typedef" (=type definition) isola solo la definizione del tipo.
Mi sembra strano che tu vada in crisi per questo, comunque
l'importante è che tu abbia capito.

libro. 
La spiegazione ti è stata data anche qui dentro :-)