In effetti e` la stessa cosa che avrei pensato io fino a 10 minuti fa, ovvero prima di vedere l`output in asm di quel listato.
Guarda qui:
codice:
#include <stdio.h>
#include <string.h>
void stampa1( char telf[][ 14 ] )
{
int i;
for( i = 0; i < 3; i++ )
printf( "tel%i: %s\n\n", i, telf[ i ] );
}
void stampa2( char* telf )
{
int i;
for( i = 0; i < 3; i++ )
printf( "tel%i: %s\n\n", i, &telf[ i * 14 ] );
/* Alternativa:
* printf( "tel%i: %s\n\n", i, telf + i * 14 );
*/
}
void stampa3( char esempio[][ 2 ][ 3 ] )
{
/* ... */
}
int main()
{
char tel[ 3 ][ 14 ];
char esempio[ 1 ][ 2 ][ 3 ];
strcpy( tel[ 0 ], "0661564048" );
strcpy( tel[ 1 ], "0666397" );
strcpy( tel[ 2 ], "3297752447" );
stampa1( tel );
stampa2( ( char* ) tel );
stampa3( esempio );
return 0;
}
Come vedi, puoi passare un array multidimensionale statico purche` tu specifichi tutte le dimensioni tranne la prima, che e` opzionale. E a volte mi sono chiesto il perche` di cio`, ed ora l`ho capito cazzo!
Un array statico multidimensionale in C non e` un array di array, quindi ha differente livello di indirezione da un puntatore a puntatore!!!
'tel' va in effetti castato a char*, e i limiti dell`array specificati nel prototipo delle funzioni sono indispensabili per calcolare l`offset dal puntatore all`inizio dell`array, che quindi a basso livello e` _sempre_ monodimensionale (qui e` char*)!
Ti ringrazio per avermi spinto ad approfondire l`argomento.
Ciao.