la L davanti a buona sera significa che la stringa seguente è una stringa estesa, un po' come quando scrivi

long i = 33L;

la L in fondo serve a dire che 33 è una costante letterale di tipo long, nello stesso modo una L davanti ad una costante letterale di tipo 'char' o di tipo 'stringa di char' indica al compilatore di riservare spazio in memoria non già per un char di 8 bit, ma per un char di una altra misura, diciamo 16 bit.

Esempio:

char * stringa = "Buona sera!";

il compilatore assegna un'area di memoria che contiene un puntatore e un area che contiene la stringa, inoltre fa si che il puntatore punti a quest'area.

supponi che stringa sia allocata all'indirizzo 20 e "Buona sera!" all'indirizzo 50, supponiamo anche di parlare di architettura simile alla Intel a 32 bit, i principi valgono poi per quasiasi piattaforma, supponi inoltre (come è al 99% dei casi) che il compilatore tratti i wchar_t come caratteri UNICODE, ovvero il carattere 'A', ascii 0x41, viene memorizzato come carattere a 16 bit, ovvero 0x0041.
codice:
 INDIRIZZI    DATI (8 bit)
+----------+----- 
 20        |  50 >
 21        |   0 > indirizzo della stringa
 22        |   0 > 
 23        |   0 >

.....
 50        |  'b'
 51        |  '\0'  
 52        |  'u' 
 53        |  '\0' 
 54        |  'o'
 55        |  '\0'
 ....

Se invece non mettevi la L davanti

 INDIRIZZI    DATI (8 bit)
+----------+----- 
 20        |  50 >
 21        |   0 > indirizzo della stringa
 22        |   0 > 
 23        |   0 >

.....
 50        |  'b'
 51        |  'u'  
 52        |  'o' 
 53        |  'n' 
 54        |  'a'
 55        |  ' '
 ....
Ora chiedimi: perchè usare caratteri a 16 bit, che quelli a 8 sono così comodi?

Siccome in molti sistemi operativi, tra cui windows 2000, tutte le stringhe sono a 16 bit, le prestazioni generali delle applicazioni sono migliori il sistema non deve convertirle).

Inoltre puoi scrivere programmi da vendere in Cina, grazie al fatto che UNICODE è in grado di gestire l'alfabeto cinese.