const char* const bedeutet ein const Zeiger auf const Daten. const char* ist nur ein const Zeiger auf variable Daten.
Wenn du deine getString() Funktion so hast und gleich einen char* übergibst um den String auszulesen, was machst du dann mit dem zweiten Array? Das Array aus Strings brauchst du nur wenn du per Index auf die Strings zugreifen willst. Hier habe ich das erst letztens gezeigt: http://forum.arduino.cc/index.php?topic=352709.msg2431938#msg2431938
Das was Whandall geschrieben hat gilt auch nur für die Variante auf der PROGMEM Seite, bzw. im Link oben (und dann ist es "word" statt "int"). Das hat mich auch erst verwirrt. So wie du das heißt reichen die einzelnen Strings im PROGMEM und die übergibst dann die Adresse eines Strings direkt an die Funktion. Da fehlt eben diese Zwischenstufe.
Es gibt übrigens auch strlcpy_P(). Da kannst du BUFSIZE als Größe übergeben und es wird maximal BUFSIZE - 1 kopiert.
Es gibt auch pgm_read_ptr(), was in diesem Fall semantisch etwas aussagekräftiger wäre. Das liefert einen void*. Den muss dann aber glaube ich genauso casten.
Aber wie gesagt ist dieser Schritt sowie er es hat gar nicht unbedingt nötig, wenn er direkt die Adresse des eigentlichen Strings übergibt und diese nicht erst aus dem Flash ausliest. Also man kann direkt getString(CALSTART) machen.
Wenn er allerdings getString(&startMenu[0]) machen will, dann muss man erst mal den Zeiger aus dem Flash auslesen und danach erst an strcpy_P() übergeben.
Noch eine mögliche Variante ist es das Zeiger-Array im RAM zu lassen. Also da kein PROGMEM. Dann geht die Funktionen mit beiden Aufrufen. Das verbraucht dann 2 Byte RAM pro Zeiger.
Und noch etwas komplizierter wird es, wenn man oberhalb der 64k Grenze Sachen ablegen will,
dann muss man mit den _far Varianten der Funktionen arbeiten.
Ich habe das mal überflogen, kann aber '>64k geht nicht ohne Aufteilung', nicht bestätigen.
Wenn man nicht aufteilt, muss man mit der Grenze aufpassen.
Aber das Testprogramm macht nicht viel, druckt nur Arrays aus, benimmt sich aber normal.