C matemática de puntero con estructuras

Intentando aprender matemáticas de punteros mejor escribí este código. La intención era incrementar el puntero arrojó la estructura e imprimir sus miembros. Sé cómo imprimir sus miembros de formas más fáciles, pero realmente me gustaría saber cómo se estropean las matemáticas de mi puntero. Gracias

typedef struct{ 
  int num;
  int num2;
  char *string;
} astruct ;

int main (int argc, const char * argv[])
{
  astruct mystruct = { 1234, 4567,"aaaaaaa"};

  astruct *address;
  address = &mystruct;

  // this does print 1234
  printf("address 0x%x has value of:%i\n",address, *address); 
  address = address + sizeof(int);

  //this does NOT print 4567
  printf("address 0x%x has value of:%i\n",address, *address); 
  address = address + sizeof(int);

  //this crashes the program, I wanted to print aaaaaaaa
  printf("address 0x%x has value of:%s\n",address, **address); 

  return 0;
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta