Sachez que
"abc"
alloue la mémoire statique, quelque part, qui dure toute la durée de vie du programme. Vous ne pouvez pas écrire dans ce stockage, donc C++ lui donne le type char const[N]
(un tableau de N caractères constants). Maintenant, voilà ce fait un point de pointeur vers que le stockage
char *first = "hi";
Depuis gouttes une const
, cette façon d'initialiser le pointeur est dépréciée. Cela fonctionne tout simplement pour garder la compatibilité ascendante avec C, où un littéral de chaîne n'a pas de type const (mais est toujours en lecture seule). Préférez les éléments suivants à la place
char const *first = "hi";
En constraste, la dernière façon que vous avez montré copie la chaîne de contenu littéral à un tableau, qui sera inscriptible, et être dimensionnés de sorte que la chaîne littérale adapte juste en elle.
char third[] = "new";
Si vous faites cela dans une fonction, alors comme toutes les variables, ce tableau sera nettoyé lorsque vous quitterez sa portée. Maintenant, la première manière que vous avez montrée est différente. Il crée un personnage dynamiquement. Vous pourriez avoir initialisé comme ça
char *c = new char('A');
Et comme cela se produit de façon dynamique, vous devez dire au compilateur explicitement quand il doit libérer la mémoire
delete c;
Mais vous ne pouvez pas initialiser le caractère avec une chaîne littérale . Ce que vous aviez probablement à l'esprit est de créer dynamiquement du stockage, initialisé avec le littéral de chaîne. Ce n'est pas possible en utilisant new
. La seule forme d'initialisation d'un tableau dynamique consiste à le mettre à zéro, mais vous ne pouvez pas l'initialiser directement avec le contenu d'un littéral de chaîne ou d'un autre tableau. Pour cette forme d'utilisation new
, il est rarement nécessaire de le faire directement. Si vous voulez, vous pouvez le faire en créant un tableau dynamique de la bonne taille, puis copier octets de la chaîne littérale à ce tampon
char *c = new char[sizeof "hello"]; // sizeof "hello" will give 6
std::strcpy(c, "hello");
delete[] c; // delete[] is for deleting dynamic arrays
Rappelez-vous que cela est assez bas niveau, et je vous recommande utiliser des chaînes
std::string s = "hello"; // s.size() gives you its size
Il gère complètement la mémoire pour vous. La concaténation, l'indexation et tout ça sont également disponibles.
+1. La seule chose que je voudrais ajouter est un petit peu sur char vs char *. En lisant la question de l'OP, il semble qu'il soit confus à propos des chaînes de caractères char vs c/style. – kbyrd
Merci. ajouté quelques autres choses –
bon résumé man. Ne pensez-vous pas qu'il y a un problème avec les nouveaux arrivants qui dépendent trop de std :: string. Cela rend C++ trop semblable à Java et quand vous devez travailler avec char *, vous êtes perdu. – toto