View Full Version : [C] Puntatore matrice
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 "
matrice[0][0] è di per se un puntatore.. prova togliendo la &
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]
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.
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 è?
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.
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 è.
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.