Using PROGMEM to save RAM
The important thing to know for PROGMEM is that the AVR chip you’re using does not have a single flat address space. I.e., it does not use a von Neumann architecture; instead, it uses a specific version of what is known as a Harvard architecture: it has separate address spaces for RAM, program memory, and EEPROM. All of them start at 0. Which means that while dereferencing a nullptr is technically still undefined behavior in C++, it can be (and often is) perfectly valid in Arduino code.

The short version is: If you have a PROGMEM pointer, whatever function you pass it to must work on PROGMEM pointers. lcd.print does not, and afaict there is no way the function could possibly detect this is not a RAM pointer. You have to call a different function, assuming there is one in the first place.

See http://arduino.cc/en/Reference/PROGMEM for examples on how to use PROGMEM data.