2012-05-11 9 views
9

Ecco un esempio di programma:Qual è il punto della sintassi dell'array di C se scarta i dati di lunghezza?

#include <stdio.h> 

void foo(int b[]){ 
    printf("sizeof in foo: %i\n", sizeof b); 
} 

int main(){ 
    int a[4]; 
    printf("sizeof in main: %i\n", sizeof a); 
    foo(a); 
} 

L'output è:

sizeof in main: 16 
sizeof in foo: 8 

domanda è, qual è il punto di che sintassi se è solo convertito in un puntatore standard al confine funzione?

+0

Si sa, è possibile dichiarare 'void foo (int b [4])' se si conosce la dimensione in anticipo. – Kevin

+3

@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

risposta

12
  1. È zucchero sintattico: void foo(int b[]) suggerisce che b sta per essere usato come un array (piuttosto che una singola out-parametro), anche se in realtà è un puntatore.

  2. È un rimanente da early versions of C, dove il suffisso [] era la sintassi per una dichiarazione di puntatore.

+0

+1 lo zucchero è sempre buono – Mehrdad

+14

@Mehrdad: non necessariamente. Lo zucchero sintattico provoca il cancro del punto e virgola. –

+1

@larsmans Stai pensando allo zucchero sintetico sintetico. http://en.wikipedia.org/wiki/Synthetic_programming –

0

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).