ad 1: Der EEPROM hat Adressen von 0 bis E2END. Letzteres ist ein Define, das du via #include <avr/io.h> definiert bekommst.
ad 2: Nein
ad 3: Dafür hats die Funktionen eeprmo_read_block resp. eeprom_write_block.
ad 4: Die Adressen der Objekte (Strukturen, Arrays, ...) kannst du dem Compiler überlassen. Falls du das nicht magst kannst du die Adressen auch selbst ausdenken, aber wenn die Adressen zur Compilezeit bekannte Konstanten sind ist das Energieverschwendung...

Ein paar Beispiele finden sich im RN-Wissen-Artikel [wiki="avr-gcc"]