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.