66 votes

Pourquoi une chaîne de caractères peut-elle être affectée à un pointeur char*, mais pas à un tableau char[] ?

Quelqu'un peut-il expliquer pourquoi cela fonctionne avec le pointeur :

char * str1;

str1 = "Hello1";

str1 = "new string";

// but not this
char str2 [] = "hello";
str2 = "four";

// or this
char str3 [];
str3 = "hello";
str3 = "hello";

88voto

tryurbest Points 1309

Pourquoi cela fonctionne avec les pointeurs :
Quand vous dites char * str1 en C, vous allouez un pointeur dans la mémoire. Lorsque vous écrivez str1 = "Hello"; vous créez un littéral de chaîne en mémoire et faites pointer le pointeur vers lui. Lorsque vous créez une autre chaîne littérale "new string" et l'affecter à str1 vous ne faites que changer l'endroit où pointe le pointeur.

Pourquoi cela ne fonctionne pas avec les tableaux :
Quand vous dites char str2 [] = "Hello" vous créez une chaîne littérale et la placez dans le tableau lors de sa définition. Il est possible de ne pas donner de taille, car le tableau la calcule et ajoute une balise '\0' à ce sujet. Vous ne pouvez rien réaffecter à ce tableau sans le redimensionner. C'est pourquoi str2 = "four" ne fonctionnera pas.

En cas de str3 c'est le même cas. Vous n'avez pas défini la taille du tableau dans la définition, il a donc calculé que sa taille était de 0. Vous ne pouvez pas attribuer de nouvelles valeurs sans redimensionner le tableau.

24voto

Armen Tsirunyan Points 59548

Un tableau et un pointeur sont des choses différentes, c'est pourquoi. Vous pouvez assigner à un pointeur, mais vous ne pouvez pas assigner à un tableau. Une exception spéciale est faite pour l'initialisation des tableaux de caractères avec des chaînes de caractères.

char a[] = "Hello"; //initialize a char array with string literal. Special case, OK
char* p = "Hello"; //initializa a pointer with an array(which gets converted to pointer)
p = "My";   //assign pointer to point to another value. OK
a = "My";   //error, arrays cannot be assigned to. Use `strcpy`

Les chaînes littérales (telles que "Hello") sont de type char[N]N est le nombre de caractères (y compris la terminaison '\0' ). Un tableau peut être converti en un pointeur sur son premier élément, mais les tableaux et les pointeurs ne sont pas la même chose, quoi qu'en disent certains mauvais livres ou professeurs.

7voto

Julian Points 1441

En clair, parce qu'un tableau n'est pas un objet de première classe en C/C++. La seule façon d'assigner à un tableau est d'utiliser str(n)cpy ou memcpy.

Alors qu'un tableau se réduit à un pointeur lorsqu'il est transmis à une fonction, il n'est pas possible d'assigner à un tableau, sauf au moment de la compilation comme initialisation.

5voto

joker007 Points 331

Le cas des pointeurs Cela fonctionne parce que lorsque vous assignez comme str1="Hello" Vous créez en fait une chaîne littérale nommée hello, vous l'allouez quelque part dans la mémoire, et vous attribuez l'adresse du premier caractère de la chaîne littérale au pointeur, et comme le pointeur n'est pas constant, vous pouvez l'attribuer à nouveau avec des adresses différentes. Et un autre point important à noter est que les chaînes littérales créées sont dans une mémoire en lecture seule.

Le cas des tableaux de caractères Vous pouvez lui attribuer une chaîne littérale lors de l'initialisation, car cela est pris en charge par le langage. Ne confondez pas affectation et initialisation. Pendant l'affectation, comme il s'agit d'un tableau de caractères, vous devez changer la valeur caractère par caractère, vous essayez d'adresser la première adresse de la chaîne littérale au premier caractère du tableau (le nom du tableau renvoie l'adresse du premier élément du tableau), ce qui n'est pas correct car le premier élément n'est pas un pointeur, il ne peut pas stocker d'adresse.

4voto

Sawan Points 226

C'est simplement parce que, lorsque vous écrivez ce code :

char str2 [] = "hello";

ou même :

int arr[] = {1,2,4,4,5};

il crée str2 o arr comme un pointeur constant. C'est pourquoi vous ne pouvez pas réassigner d'autres valeurs à ces pointeurs, alors que dans le cas suivant, vous créez un pointeur normal et vous pouvez lui assigner n'importe quoi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X