@2501 , ma, poiché si desidera che l'array modificato venga riflesso nella funzione principale, non è effettivamente necessario un puntatore all'array (il che complicherà maggiormente le cose)! Basta passare direttamente l'array mentre otterrai i risultati attesi!
Perché, chiedi?
Risposta breve: in C, gli array vengono passati per riferimento.
Risposta lunga:
tenere sempre a mente che quando si utilizza il nome di un array, esso viene convertito in un puntatore al suo primo elemento†. Questo è comunemente chiamato "array decay".
Tornando al codice, il diagramma di bool matrix[rows][cols];
sarebbe:
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| matrix[0][0] | matrix[0][1] | matrix[0][2] | ... | matrix[0][cols - 1] |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| matrix[1][0] | matrix[1][1] | matrix[1][2] | ... | matrix[1][cols - 1] |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| ... | ... | ... | ... | ... |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| matrix[rows - 1][0] | matrix[rows - 1][1] | matrix[rows - 1][2] | ... | matrix[rows - 1][cols - 1] |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
Dal diagramma sopra, è chiaro che il primo elemento di
bool matrix[rows][cols];
è la prima sottomatrice matrix[0][0]
a matrix[0][cols - 1]
. Quindi, quello che succede qui è che l'indirizzo di questo subarray viene passato alla funzione. Questo è di tipo bool (*)[cols]
. Ciò significherebbe che
void func(int rows, int cols, bool matrix[rows][cols])
avrebbe funzionato allo stesso modo di
void func(int rows, int cols, bool (*matrix)[cols])
Così, per esempio, se si voleva scrivere al terzo slot della seconda sottoarray di matrix
, è possibile utilizzare matrix[1][2] = WHATEVER;
e le modifiche apportate dalla funzione influirebbero anche sul chiamante poiché l'indirizzo è stato passato.
†: Ci sono alcune eccezioni in cui allineamento "decadimento" non si verifica. Vedi Exception to array not decaying into a pointer?
Basta sbarazzarsi di '&' e '' 'e tutto dovrebbe andare bene - gli array si decompongono in puntatori quando vengono passati come parametri di funzione. –
Quali errori ottieni esattamente? – jboockmann
@pytheos è un tipo di puntatore incompatibile. Il mio male - sembrava molto quando ho fatto la mia prima modifica. – Synlar