int * x = malloc (sizeof (int) * 10);
Malloc aloca espaço suficiente para armazenar 10 inteiros e retorna um void * para o início do espaço alocado.
int * y = (int *) malloc (sizeof (int));
Malloc aloca espaço suficiente para armazenar um único inteiro e o tipo de retorno é convertido de um void * para um int *.
int * z = (int *) malloc (sizeof (int) * 10);
Malloc aloca espaço suficiente para armazenar 10 inteiros e o vazio * retornado que aponta para o início do espaço é convertido em um int *.
A diferença?
1 e 3 criam matrizes de inteiros, 2 cria um único inteiro, além disso, 1 e 3 convertem o tipo de retorno para corresponder ao tipo que está sendo atribuído. Algumas pessoas tratam isso como uma regra rígida e outras não, no final do dia ambos trabalham.
Qual é a diferença entre x, y, z?
int * x = malloc (sizeof (int) * 10);
int * y = (int *) malloc (sizeof (int));
int * z = (int *) malloc (sizeof (int) * 10);