Ciao, per il primo quesito non so come sia l''output, o quello che vuoi ottenere ma prova cosi:
#define DIM 10
int i;
char **x = (char **) malloc (sizeof(char*)*DIM);
for(i=0;i<DIM;i++)
{
x[i] = (char*) malloc (sizeof(char)*DIM);
char a[]={"987654321"};
//*x[i]=a[i];
strcpy(&*x[i],&a[i]); //utilizza la strcpy
printf("x %s \n",x[i]);
printf("a %c \n",a[i]);
}
per quanto riguarda il secondo quesito invece la strcmp verifica se le due stringhe sono uguali e no se una è più lunga dell'altra, e per farlo confronta lettera per lettera le due stringhe. E restituisce 1 nel caso la prima è maggiore dell'altra e -1 al contrario. Per esempio:
strcmp("ciao","mondo") ritorna -1 perchè c viene prima di m.
strcmp("ciao","albero") ritorna +1 perchè a viene prima di c.
strcmp("ciao","caio") ritorna +1 perchè a viene prima di i.
spiegando meglio la situazione se vuoi confrontare due parole in ordine alfabetico per esempio casa con albero utilizzi strcmp("casa","albero") ritorna 1 perchè albero viene prima di casa.
Nel tuo caso i numeri sono comunque stringhe quindi strcmp("15","2"); 1 viene prima di 2 quindi ritorna -1. facendo invece strcmp("35","2") ritorna 1 perchè 2 viene prima di 3.
Spero di essere stato chiaro.
Ciao.