La dichiarazione dell'array dovrebbe essere così:
const char s1[] PROGMEM = "Pippo";
const char s2[] PROGMEM = "Paperino";
const char s3[] PROGMEM= "Paperoga";
const char* ss[] PROGMEM = {s1, s2, s3, NULL};
E quindi ci puoi lavorare con qualcosa del genere:
PGM_P s;
int i;
for (i = 0; (s = reinterpret_cast<PGM_P> (pgm_read_ptr (&ss[i]))); i++) {
Serial.println (s);
}
Se preferisci lavorare solo coi puntatori:
const char **sptr;
PGM_P s;
for (sptr = ss; (s = reinterpret_cast<PGM_P> (pgm_read_ptr (sptr))); ++sptr) {
Serial.println (s);
}
Non garantisco (soprattutto sulla seconda che, anzi, sono quasi certo che non funzioni, se riesco correggo stasera con un Arduino sotto mano), sono andato a memoria :).
Nota comunque l'uso di pgm_read_ptr(). In giro tutti usano pgm_read_word(), che su AVR funziona, perché i puntatori tengono 16 bit, ma è concettualmente sbagliato e non portabile.