Data una matrice (ad esempio int a[3][5] perchè:
*(a[i] + j) corrisponde a a[i][j] ?
Grazie
Andrea
Data una matrice (ad esempio int a[3][5] perchè:
*(a[i] + j) corrisponde a a[i][j] ?
Grazie
Andrea
Se scrivi uno schemino su come i dati sono conservati in memoria, lo comprendi facilmente.
Ad esempio, gli elementi dell'array
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
sono memorizzati in sequenza a partire dall'indirizzo di a[0]
Tramite l'aritmetica dei puntatori, a partire da quell'indirizzo, si arriva agli altri elementi.
Ovviamente lo stesso dicasi in generale per
a[i][0] a[i][1] a[i][2] a[i][3] a[i][4]
No . Il compilatore semplicemente crea un array di x*y elementi .
Nel caso di un array di questo tipo
int a[2][3];
gli elementi allocati sono 2 x 3 -> 6 e sono posti in memoria in modo contiguo
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
Ma se scrivi
int *p = a[1];
il compilatore e' abbastanza "furbo" da memorizzare in p l'indirizzo dell'elemento
a[1][0]
sono abbastanza noob sui puntatori, ma credo che conti j valori dopo a[i]. Quindi dato che gli elementi degli array sono dichiarati appositamente un dopo l'altro, aggiungendo j a a[i] si arriverà ad a[i] [j]. Ma sei J è superiore alle colonne punterà alla riga sotto e di conseguenza aumenterà anche I
Non stai dichiarando un doppio puntatore.
Il doppio puntatore ti serve per gestire l'allocazione dinamica dell'array (se non conosci a priori il numero di righe e colonne).
Considera che la scrittura
char im[x][y];
se x e y non sono costanti, non e' consentita.
Se invece sai che l'immagine sara' di 100 righe da 200 caratteri, puoi scrivere
char im[100][200];
La scritturaOriginariamente inviato da oregon
Ma se scrivi
int *p = a[1];
il compilatore e' abbastanza "furbo" da memorizzare in p l'indirizzo dell'elemento
a[1][0]è errata. Se si vuole inizializzare un puntatore ad un elemento di un array lo si deve fare attraverso l'operatore indirizzo tranne nel caso in cui lo si vuole inizializzare all'elemento 0 dellla matrice.codice:int *p = a[1]
In quel caso si scrive:codice:int *p = a /* perchè a, contiene l'indirizzo iniziale dell'array e quindi dell'elemento 0 */
ah questo non lo sapevo... In C# è consentito anche se la variabile non è const. Che brutto modo di programmare che insegna il .netOriginariamente inviato da oregon
Il doppio puntatore ti serve per gestire l'allocazione dinamica dell'array (se non conosci a priori il numero di righe e colonne).
Considera che la scrittura
char im[x][y];
se x e y non sono costanti, non e' consentita.
Se invece sai che l'immagine sara' di 100 righe da 200 caratteri, puoi scrivere
char im[100][200];
Quindi in pratica in C vanno usate le funzioni di assegnamento dinamico per fare una cosa del genere?
No ... non e' cosi'. La scrittura in questione e' perfettamente corretta.Originariamente inviato da devil89
La scritturaè errata.codice:int *p = a[1]
Nel caso di un array come quello che ti ho indicato
int a[2][3];
la scrittura
int *p = a[1];
e' perfettamente legale ed equivale a
int *p = &a[1][0];
Se il puntatore deve puntare all'inizio della riga, puoi scrivere come ti ho detto.Originariamente inviato da devil89
Se si vuole inizializzare un puntatore ad un elemento di un array lo si deve fare attraverso l'operatore indirizzo tranne nel caso in cui lo si vuole inizializzare all'elemento 0 dellla matrice.