c'est un bon résumé - un peu simplifié
juste sur ce point:
C'est un gros raccourci. Il s'agit bien de deux types différents
Un pointeur ne connait pas la taille du contenu pointé
Un tableau connait la taille du contenu pointé
si vous faites cela
const char txt[] = "salut";
const byte taille2 = sizeof txt;
taille2
contient bien le nombre d'octets alloués pour le tableau mais si vous faites
const char *texte = "bonjour";
const byte taille1 = sizeof texte;
vous avez dans taille1
la taille d'un pointeur sur la plateforme choisie (2 ou 4 octets)
c'est quand vous passez un tableau en paramètre à une fonction qui attend un pointeur que se produit le "decay" et que le type est changé en pointeur et donc au sein de la fonction on n'a plus accès à la taille du tableau.
Sinon, pour ceux qui veulent en savoir plus que de nécessaire (mais c'est important à comprendre)
Ce 'est plus tout à fait vrai depuis C++11 car on peut spécifier le type d'encoding que l'on souhaite avoir pour les caractères en rajoutant un préfixe à la chaîne (u8, u L, U)
void setup() {
Serial.begin(115200);
Serial.print("Nombre d'octets de base = "); Serial.println(sizeof "Hello");
Serial.print("Nombre d'octets pour u8 = "); Serial.println(sizeof u8"Hello");
Serial.print("Nombre d'octets pour u = "); Serial.println(sizeof u"Hello");
Serial.print("Nombre d'octets pour L = "); Serial.println(sizeof L"Hello");
Serial.print("Nombre d'octets pour U = "); Serial.println(sizeof U"Hello");
}
void loop() {}
-
sans préfixe, vous aurez 6 octets (les 5 lettres ASCII et le caractère nul sur un octet). le type est const char[6]
-
avec le préfixe u8 vous aurez aussi 6 octets. Avec u8, les lettres sont codée en UTF8. Comme ici c'est de l'ASCII on a un octet par caractère plus le nul donc ça fait 6. le type est const char[6]
aussi mais changera en const char8_t[6]
avec la version C++23
-
avec le préfixe u minuscule (sans le 8), vous aurez 12 octets. Avec ce u vous dites au compilateur que vous voulez forcer la représentation en UTF-16 (2 ou 4 octets par symbole) et dans ce cas le type du tableau est const char16_t[6]
(ici 6 parce que on n'a que de l'ASCII dans le texte et ils tiennent tous sur 2 octets. l'UTF16 a certains caractères codés sur 4 octets)
-
avec le préfixe L vous aurez 12 octets. (les 5 lettres ASCII et le caractère nul). le stockage est de type wchar_t
(wide char) qui est codé sur 2 octets, donc on a 12 octets en tout (et le 0 final est codé aussi sur 2 octets). Le type est const wchar_t[6]
-
avec le préfixe U majuscule, vous passez en représentation UTF-32, chaque symbole (on appelle cela des code points en fait) est codé dans un type char32_t donc sur 4 octet. Le type de notre chaîne est alors char32_t[6]
ce qui fait 24 octets (le zero final est aussi sur 4 octets).
Notez que l'IDE a choisi l'utf8 pour l'encodage des chaînes par défaut, donc si vous mettez juste des trucs entre guillemets vous aurez en fait de l'UTF8, c'est pour cela qu'on peut mettre des caractères accentués, le symbole € et d'autres symboles dans une chaîne quand on programme.
Cependant certains caractères peuvent prendre jusqu'à 4 octets et les fonctions standard datant du C ne savent pas gérer cela... si vous demandez la longueur de la chaîne "1€" en faisant
Serial.println(strlen("1€"));
vous vous attendriez sans doute à avoir 2 puisqu'il y a deux caractères le '1' et le '€'... Et pourtant ça vous dira 4... parce que le symbole '€' est codé sur 3 octets en UTF8...
(en espérant ne pas avoir apporté de confusion )