domanda è, qual è il punto di che sintassi se è solo convertito in un puntatore standard al confine funzione?
In questo caso, poiché si passa l'array come argomento C ha creato un puntatore a un dato indirizzo, tuttavia, il caso veramente interessante è ciò che accade quando si assegna un array nello stack e solo usalo lì.
Quando si esegue questa operazione, il compilatore converte quindi le istruzioni di caricamento per quell'array non in un puntatore più offset, ma l'accesso diretto allo stack base + offset poiché, perché no? Non ha senso memorizzare il puntatore comunque.
Tuttavia, quando si tratta di passare quell'array attorno, il compilatore passa l'indirizzo della base dell'array alla funzione - come un puntatore.
In breve, []
consente di eseguire l'aritmetica del puntatore in modo più accurato. Nel caso di dichiarare gli array, può essere ottimizzato via - che è il motivo per cui gli array non sono puntatori, anche se sono accessibili tramite puntatori in determinate circostanze (e non in altri).
fonte
2012-05-11 15:07:56
Si sa, è possibile dichiarare 'void foo (int b [4])' se si conosce la dimensione in anticipo. – Kevin
@Kevin Questo non fa alcuna differenza, si potrebbe comunque passare una matrice di lunghezza diversa da 4 a 'pippo'. Se vuoi consentire solo array di lunghezza 4 'pippo' deve essere' void foo (int (* b) [4]) ' – Praetorian