Devo allocare dinamicamente una matrice di interi;
perchè non è possibile farlo in questo modo?:
int **p;
p=new int[5][5];
grazie
Devo allocare dinamicamente una matrice di interi;
perchè non è possibile farlo in questo modo?:
int **p;
p=new int[5][5];
grazie
La teoria è quando si sa tutto ma non funziona niente.
La pratica è quando funziona tutto ma non si sa il perché.
In ogni caso si finisce sempre con il coniugare la teoria con la pratica:
non funziona niente e non si sa il perché.
(Albert Einstein)
Perché sono 2 tipi completamente diversi! Puoi usare int **p per un array bidimensionale di interi ma l'allocazione è da fare in modo completamente diverso.Originariamente inviato da zuffff
Devo allocare dinamicamente una matrice di interi;
perchè non è possibile farlo in questo modo?:
int **p;
p=new int[5][5];
grazie
Esempio:
Dichiarando int **matrice, si dichiara "un puntatore a puntatore a int". Questo vuol dire che l'unico modo per avere così un array bidimensionale, è quello di creare "un array di array". Con la prima new alloco un array di puntatori ad int. Con le successive N new alloco N array di interi. In questo modo matrice[i][j] si comporta proprio come volevi.codice:int i; int **matrice; matrice = new int*[5]; for (i = 0; i < 5; i++) matrice[i] = new int[5];
Mentre invece int matrice[5][5] è una cosa molto diversa. Intanto solo questo è il vero array bidimensionale come inteso dal "C", cioè un insieme contiguo di elementi. Quello di prima è "un array di array", cioè un semplice array in cui ogni elemento punta ad un altro array.
Se provi a compilare il tuo codice, otterresti un errore di questo tipo:
cannot convert `int (*)[5]' to `int**' in assignment
I due tipi sono molto diversi. Dichiarando int matrice[5][5], per accedere ad una cella [i][j], il compilatore produce un qualcosa del tipo:
*(((int*) matrice) + i*5 + j)
Che è quindi ben diverso dal dereferenziare 2 volte un puntatore **.
Spero di aver spiegato bene la questione.![]()
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Credo di aver capito più o meno l'errore.
Ho ancora un dubbio: nel dichiarare la matrice nel modo in cui mi hai indicato le cella in memoria saranno contigue?
Potrò accedervi con un semplice for?
La teoria è quando si sa tutto ma non funziona niente.
La pratica è quando funziona tutto ma non si sa il perché.
In ogni caso si finisce sempre con il coniugare la teoria con la pratica:
non funziona niente e non si sa il perché.
(Albert Einstein)
Guarda ... usando un puntatore **, un array bidimensionale ha questa struttura:Originariamente inviato da zuffff
Ho ancora un dubbio: nel dichiarare la matrice nel modo in cui mi hai indicato le cella in memoria saranno contigue?
Credo che così sia chiaro come sono organizzate le celle.![]()
Certo.Originariamente inviato da zuffff
Potrò accedervi con un semplice for?
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
grazie mille. ora ho capito!ciao
La teoria è quando si sa tutto ma non funziona niente.
La pratica è quando funziona tutto ma non si sa il perché.
In ogni caso si finisce sempre con il coniugare la teoria con la pratica:
non funziona niente e non si sa il perché.
(Albert Einstein)
Raga scusate ma sono nuovo del c e davvero con i puntatori non ci sto capendo molto.
Quello che sto cercando di fare è calcolare un determinante di una matrice di dimensione al massimo 100*100.
Ho preso spunto dalla vostra discussione ma mi riesce difficile capire quello che è stato scritto qui:
int ** matrice non ho capito cosa sta ad indicare.codice:int i; int **matrice; matrice = new int*[5]; for (i = 0; i < 5; i++) matrice[i] = new int[5];
Ma è un puntatore ad un vettore???
E' bidimensionale????
se devo accedere sia alle righe che alle colonne per riempire la matrice come devo fare??
Dimenticavo sto usando il C non il C++ !!!!!
E' stato inizializzato un puntatore ad un vettore di 5 puntatori. A loro volta, ognuno dei 5 puntatori, punta ad un vettore di 5 elementi interi.Originariamente inviato da Matrix_denny
...mi riesce difficile capire quello che è stato scritto qui:
codice:int i; int **matrice; matrice = new int*[5]; for (i = 0; i < 5; i++) matrice[i] = new int[5];
Si ottiene cosi' un insieme di 5 vettori a 5 elementi, quindi una tabella (un array a 2 dimensioni). Per allocare la tua matrice 100 x 100 devi sostituire tale valore nel codice.
codice:matrice = new int*[100]; for (i = 0; i < 100; i++) matrice[i] = new int[100];E' un puntatore a puntatore. Nel caso suddetto, serve a puntare al primo puntatore del vettore di puntatori ...int ** matrice non ho capito cosa sta ad indicare.
Ma è un puntatore ad un vettore???
E' un termine che non si addice ad un puntatore ...E' bidimensionale????
Per esempiose devo accedere sia alle righe che alle colonne per riempire la matrice come devo fare??
matrice[3][2] = 159;
Allora non usare l'operatore new per allocare ma le funzioni calloc o malloc ... Il resto non cambia ...Dimenticavo sto usando il C non il C++ !!!!!
... me ne hai già aperta una. Non possiamo parlare del tuo problema in tutte le discussioni del forum, una basta e avanza.Originariamente inviato da Matrix_denny
Ho preso spunto dalla vostra discussione![]()
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...