PDA

View Full Version : [C] Puntatore matrice


biowep
20-10-2011, 13:45
Ciao
Perché non è possibile utilizzare un puntatore (con il doppio indice) negli array bidimensionali?

Mi spiego meglio
int arr[5];
//Il nome "arr" non è altro che un puntatore all'elemento arr[0].

int *puntatore=&arr[0]
//arr[0]==puntatore[0]), arr[1]==puntatore[1]) ecc.

La domanda quindi è, perché non posso fare la stessa cosa (creare un puntatore al primo elemento e poi usare il nome del puntatore invece di quello dell'array) con le matrici?

int matrice[2][3]={2,3,4,5,6,7};
int *puntatore=&matrice[0][0];
printf("%d", puntatore[2][3]);

//genere un errore: "subscripted value is neither array nor pointer "

xfra
20-10-2011, 14:16
matrice[0][0] è di per se un puntatore.. prova togliendo la &

biowep
20-10-2011, 14:24
no, matrice[0][0] non è un puntatore ma direttamente il valore puntato
è matrice che è un puntatore all'elemento matrice[0][0]
matrice==&matrice[0][0]

Floris
20-10-2011, 14:28
int matrice[2][3]={2,3,4,5,6,7};
int *puntatore=&matrice[0][0];
printf("%d", puntatore[2][3]);

//genere un errore: "subscripted value is neither array nor pointer "

In questo caso puntatore ha tipo int*...non puoi dereferenziarlo due volte come in puntatore[2][3]...al massimo puoi fare puntatore[3]...prova a verificare.

biowep
20-10-2011, 14:35
int matrice[2][3]={2,3,4,5,6,7};
int *puntatore=&matrice[0][0];
printf("%d", puntatore[2][3]);

//genere un errore: "subscripted value is neither array nor pointer "

In questo caso puntatore ha tipo int*...non puoi dereferenziarlo due volte come in puntatore[2][3]...al massimo puoi fare puntatore[3]...prova a verificare.

allora se quello è di tipo int*
il puntatore matrice di che tipo è?

Floris
20-10-2011, 14:47
allora se quello è di tipo int*
il puntatore matrice di che tipo è?
int**.
*matrice ha tipo int* e punta al primo elemento ([0][0]).
Il primo elemento ([0][0]) della matrice lo puoi quindi ottenere con **matrice.
Il puntatore a [0][1] è invece *matrice+1 e quindi *(*matrice+1) è l'elemento [0][1].
Il puntatore a [1][0] è *(matrice +1) e quindi **(matrice +1) è l'elemento [1][0].

La regola è:
Se hai il puntatore T* p, dove T può a sua volta essere un tipo puntatore, allora p+1 è uguale a p+sizeof(T).
Negli esempi precedenti: *matrice+1 equivale a *matrice+sizeof(int) poiché *matrice ha tipo int*, mentre *(matrice+1) equivale a (matrice+sizeof(int)*3) poichè matrice ha tipo int** e le righe hanno 3 elementi. Per questo nel passaggio di matrici come parametri formali devono essere sempre specificate tutte le dimensioni della matrice tranne la prima...affinchè il compilatore possa compiere queste operazioni.

biowep
21-10-2011, 21:02
grazie della risposta

Freaxxx
22-10-2011, 09:36
vorrei precisare, onde evitare confusione, che i puntatori sono puntatori e gli array restano array, sono 2 cose diverse e separate, la "cosa" che hanno in comune è che entrambi rispondono all'aritmetica dei puntatori.

nel complesso è scorretto dire che una scritta del tipo

matrice[i][j]

sia un puntatore a puntatore, perché semplicemente non lo è.

Floris
22-10-2011, 10:57
matrice è un puntatore nel senso che la locazione di memoria ad esso assegnata contiene un indirizzo di memoria e non un dato primitivo. matrice[i][j] per ogni i,j, invece è un intero.