Cela peut être une question simple, mais pourquoi un caractère const * n'a-t-il pas besoin d'une adresse mémoire vers laquelle pointer?
Exemple:
const char* a = "Anthony";
et pas:
const char *a = // Address to const char
comme tous les autres types?
c++
c
implicit-conversion
c-strings
string-literals
Weidelix
la source
la source
Réponses:
Vous pouvez imaginer cette déclaration
de la manière suivante
Autrement dit, le compilateur crée un tableau de caractères avec la durée de stockage statique qui stocke la chaîne
"Anthony"
et l'adresse du premier caractère du tableau (en raison de la conversion implicite des désignateurs de tableau en pointeurs vers leurs premiers caractères) est affectée au pointeura
.Voici un programme démonstratif qui montre que les littéraux de chaîne sont des tableaux de caractères.
La sortie du programme est
La taille du littéral de chaîne (du tableau qui stocke le littéral de chaîne) est égale à
8
car la chaîne inclut également le caractère zéro de fin '\0'
.Dans le programme démonstratif, l'expression
peut remplacer seulement l'expression
la source
Cela fait.
Un littéral de chaîne C comme
est décomposé à l'adresse de son 1 er caractère. Comme, BTW; tout tableau en C le fait.
la source
const char[8]
(en C ++, peut-êtrechar [8]
en C, pas sûr) et comme tous les tableaux intégrés, lorsqu'il l'utilise comme valeur, il se désintègre en un pointeur sur son premier élément.char [8]
dans C: c-faq.com/ansi/strlitnotconst.htmlIl a besoin d'une adresse mémoire et il a une adresse mémoire. Dans votre exemple, c'est simplement l'adresse mémoire du début de la chaîne. C'est la même chose avec toute autre variable de tableau qui est initialisée au moment de la compilation, par exemple "int array [] = {0, 1, 2, 3};".
Si vous utilisiez un éditeur binaire pour regarder l'exécutable, vous verriez la chaîne "Anthony" là-dedans. Si vous mettez la ligne "printf (" a est à% p \ n ", (void *) a);" dans votre programme, puis compilez-le et exécutez-le, vous verrez l'adresse.
la source
En fait, il ne faut une adresse mémoire pour pointer vers.
const char* a
signifiea
un pointeur vers un littéral de chaîne ou une constante de caractère.Un pointeur nécessite toujours une adresse vers laquelle pointer car c'est la nature d'un pointeur de pointer vers un objet spécifique en mémoire. Donc,
a
et tout autre pointeur vers leconst char
fait aussi.Un littéral de chaîne comme
"Hi My Name is Alfred!"
par une affectation comme:se désintègre en un pointeur sur l'adresse du premier élément du littéral de chaîne.
Signifie à son tour,
a
est attribué par l'adresse du premier élément de la chaîne littérale"Hi My Name is Alfred!"
qui pourrait être stockée n'importe où dans la mémoire en fonction de l'environnement d'exécution.Ce n'est pas dans la puissance d'un programmeur où un littéral de chaîne est exactement stocké. Votre affectation consiste uniquement à affecter et à gérer le pointeur respectif de manière appropriée.
la source