Différence entre char* et const char*?
Quelle est la différence entre
char* name
qui pointe vers une chaîne constante littérale, et
const char* name
- qu'entendez-vous par "constant la chaîne littérale" en C (pas C++)
- ... char *nom peut être fait le point d'une constante chaîne de caractères littérale
- la constante dans la "constante de chaîne littérale" est redondante, puisque tous les littéraux de chaîne sont en théorie constante des entités. C'est le contenu de la variable qui peut être constante ou mutables. Le "const" déclaration de simplement jeter une erreur de compilation si vous essayez de modifier le contenu du caractère pointé par "nom"
- Simple: "char *name" le nom est un pointeur sur char, c'est à dire à la fois peut être changer d'ici. "const char *name" le nom est un pointeur const char c'est à dire pointeur peut changer, mais pas de char.
Vous devez vous connecter pour publier un commentaire.
char*
est un mutable pointeur vers un mutable caractère ou chaîne de caractères.const char*
est un mutable pointeur vers un immuable caractère ou chaîne de caractères. Vous ne pouvez pas modifier le contenu de l'emplacement(s) de ce pointeur pointe. Aussi, les compilateurs sont tenus de donner des messages d'erreur lorsque vous essayez de le faire. Pour la même raison, la conversion deconst char *
àchar*
est obsolète.char* const
est un immuable pointeur (il ne peut pas pointer vers un autre emplacement) mais le contenu de l'endroit où il points sont mutable.const char* const
est un immuable pointeur vers un immuable caractère ou chaîne de caractères.const char* const
, cool!char const *
char *
donner de l'erreur de segmentation lors de l'exécution?const
si je veux le compilateur à donner d'erreur si j'ai oublié et changé les données par erreur, non ?Vous pouvez modifier le char qui
name
points, et aussi le char sur lequel il pointe.Vous pouvez changer le char quiname
points, mais vous ne pouvez pas modifier le char sur lequel il pointe.correction: Vous pouvez modifier le pointeur, mais pas le char qui
name
points (https://msdn.microsoft.com/en-us/library/vstudio/whkd4k6a(v=vs. 100).aspx, voir la section "Exemples"). Dans ce cas, leconst
spécificateur s'applique àchar
, pas l'astérisque.Selon la page MSDN et http://en.cppreference.com/w/cpp/language/declarations, le
const
avant la*
fait partie de la decl-spécificateur de séquence, tandis que leconst
après*
est la partie de la déclaration.Une déclaration spécificateur de séquence peut être suivi par plusieurs declarators, c'est pourquoi
const char * c1, c2
déclarec1
commeconst char *
etc2
commeconst char
.EDIT:
Les commentaires, votre question semble se poser à propos de la différence entre les deux déclarations lorsque le pointeur pointe vers une chaîne littérale.
Dans ce cas, vous ne devrait pas modifier le char qui
name
points, car il pourrait Comportement Indéfini.Les littéraux de chaîne peut être attribuée dans la mémoire en lecture seule des régions (définie par l'implémentation) et un programme utilisateur ne doit pas modifier de toute façon. Toute tentative de le faire entraîne un Comportement non défini.
De sorte que la seule différence dans ce cas (d'utilisation avec des littéraux de chaîne), c'est que la deuxième déclaration vous donne un léger avantage. Les compilateurs seront généralement vous donner un avertissement dans le cas où vous essayez de modifier la chaîne de caractères littérale dans le second cas.
En Ligne, Échantillon De Exemple:
De sortie:
Avis le compilateur indique le second cas, mais pas pour le premier.
name
points dans les deux cas.Il pourrait en résulter en UB.char *
valeur donne une segmentation fault depuis que nous essayons de modifier une chaîne littérale (qui est présent dans la mémoire en lecture seule)Dans les deux cas, pouvez-vous modifier une chaîne littérale, indépendamment de si le pointeur vers une chaîne littérale est déclarée comme
char *
ouconst char *
.Cependant, la différence est que si le pointeur est
const char *
alors le compilateur doit donner un diagnostic, si vous essayez de modifier le pointu de valeur, mais si le pointeur estchar *
alors il n'a pas.extern ... name
et ont*name = 'X';
. Sur le bon système d'exploitation", qui peut échouer, mais sur des systèmes embarqués, je m'attends à faire quelque chose de plate-forme/compilateur spécifique.La première vous pouvez réellement changer si vous le souhaitez, le deuxième vous ne pouvez pas. Lire
const
justesse (il y a quelques belles guides à propos de la différence). Il est égalementchar const * name
où vous ne pouvez pas peretochki il.CAS 1:
Ci-dessus jeux de str à point à la valeur littérale "Bonjour", qui est codé en dur dans le programme de l'image binaire, qui est marqué en lecture seule dans la mémoire, les moyens de tout changer dans cette Chaîne littérale est illégal et que jeter de la segmentation des défauts.
CAS 2:
CAS 3:
En fait,
char* name
n'est pas un pointeur vers une constante, mais un pointeur vers une variable. Vous pouvez parler au sujet de cette question.Quelle est la différence entre char * const et const char *?
La question est de savoir quelle est la différence entre
qui pointe vers une chaîne constante littérale, et
I. e. compte tenu de
et
Il n'y a pas beaucoup de différence entre les 2 et les deux peuvent être considérées comme correctes. En raison de la longue tradition de code en C, les chaînes de caractères littérales ont eu un type de
char[]
, pasconst char[]
, et il y a beaucoup de vieux code que, de même accepterchar *
au lieu deconst char *
, même quand elles n'altèrent pas les arguments.La principale différence entre les 2 est que
*cname
oucname[n]
donnera des lvalues de typeconst char
, alors que*name
ouname[n]
donnera des lvalues de typechar
, qui sont modifiable lvalues. Conforme compilateur est nécessaire pour produire un diagnostic message si objectif de la mission n'est pas une lvalue modifiable; il n'a pas besoin de produire un avertissement sur l'affectation à lvalues de typechar
:Le compilateur n'est pas nécessaire pour arrêter la compilation dans les deux cas; c'est assez qu'il produit un avertissement pour que la cession
cname[0]
. Le programme qui en résulte n'est pas un corriger programme. Le comportement de la construction est undefined. Il peut tomber en panne, ou pire encore, il pourrait ne pas se bloquer, et peut-être changer de chaîne littérale dans la mémoire.Juste pour donner un exemple supplémentaire:
(Je suis en utilisant le typeinfo bibliothèque: http://www.cplusplus.com/reference/typeinfo/type_info/name)
Vous pouvez l'exécuter et de voir les choses mieux pour vous-même.