This creates a variable "nEE" in EEPROM and gives it an initial value of 1234. When this program is built both a .hex file for the code and a .eep file for the initial EEPROM data will be created. You use ISP to put the .hex into flash and the .eepm into the EEPROM.

When the AVR is powered on it will read the current (1234) value from the nEE location into a variable in RAM called nRAM. It will then write back that value + 1 into the nEE location in the EEPROM.

The key thing in all this is that the EEPROM variable is created using "EEMEM" and in the eeprom_do_something() functions you reference it by address using the & (address of) operator. THAT is how you provide the pointer that eeprom_*() functions are looking to use.

You will never know the actual address of "nEE" in the EEPROM (just as you probably never know the address of the nRAM variable in RAM either). The linker will assign addresses (that importantly cannot overlap!) to all the variables in your program so you don't have to use things like: