¿Cómo se asigna la memoria a las variables de diferentes tipos de datos?

Escribí el siguiente código.

#include<stdio.h>

int main()
{
    int x = 1 ;
    int *j = &x ;
    int y =  2 ;
    int *t = &y ;

    printf("%p\n" , (void *)j);
    printf("%p" , (void *)t);
}   

La salida es0028FF14 0028FF10.

El punto que quiero destacar es que la diferencia entre las direcciones es '4'.

Mientras que en este caso

#include<stdio.h>

int main()
{
    char x = 't' ;
    char *j = &x ;
    char y =  'f' ;
    char *t = &y ;
    printf("%p\n" , (void *)j);
    printf("%p" , (void *)t);    

   }   

La salida es0028FF17 0028FF16

La diferencia es1.

La diferencia en el primer caso es4. Mientras que en el segundo caso es1. ¿Por que es esto entonces?

¿Y qué obtendré si imprimo el valor en todas las direcciones de memoria individualmente?

Tal vez es realmente general y conocido, pero acabo de comenzar C, por lo que la salida del programa me confunde.

Actualizar
Ahora usando%p formatear y convertir el valor del puntero avoid* para imprimir el valor del puntero como lo sugiere Keith Thompson.

Respuestas a la pregunta(3)

Su respuesta a la pregunta