En C, je peux initialiser une chaîne de caractères dans une déclaration de pointeur de la même manière, je peux initialiser une chaîne de caractères dans un char déclaration de tableau?
Ces deux lignes de code pour obtenir le même résultat? Si j'avais ces lignes dans une fonction, à la chaîne stockée sur la pile dans les deux cas? Est-il une bonne raison pourquoi je devrais utiliser l'un sur l'autre, en dehors de ne pas avoir à déclarer le terminateur null dans la première ligne de code?
char s[] = "string";
char* s = "stringchar s[] = "string";
char* s = "string\0";
";
Juste pour information, vous n'avez pas besoin de le \0 dans le deuxième exemple. Lors de l'utilisation de guillemets, \0 est toujours inséré dans le tableau.
Et juste pour le vocabulaire, ce dont vous parlez ne sont pas des devoirs, mais des déclarations avec les initialiseurs. Ils obéissent à des règles différentes. E. g votre première déclaration ne serait pas permis comme une mission, vous ne pouvez pas attribuer les tableaux.
double possible de C: différences entre pointeur et tableau
Et juste pour le vocabulaire, ce dont vous parlez ne sont pas des devoirs, mais des déclarations avec les initialiseurs. Ils obéissent à des règles différentes. E. g votre première déclaration ne serait pas permis comme une mission, vous ne pouvez pas attribuer les tableaux.
double possible de C: différences entre pointeur et tableau
OriginalL'auteur aoeu | 2010-10-29
Vous devez vous connecter pour publier un commentaire.
Non, ces deux lignes ne sont pas atteindre le même résultat.
char s[] = "string"
résultats dans une modifiables tableau de 7 octets, ce qui est initialement rempli avec le contenu's' 't' 'r' 'i' 'n' 'g' '\0'
(tous copiés lors de l'exécution de la chaîne littérale).char *s = "string"
résultats dans un pointeur vers certains en lecture seule mémoire contenant la chaîne de caractères littérale de "chaîne".Si vous souhaitez modifier le contenu de votre chaîne, puis la première est la seule façon d'aller. Si vous avez seulement besoin d'un accès en lecture seule à une chaîne, puis le deuxième sera un peu plus rapide, car la chaîne ne doit pas être copié.
Dans les deux cas, il n'est pas nécessaire de spécifier un terminateur null dans la chaîne littérale. Le compilateur va prendre soin de cela pour vous quand il rencontre la clôture ".
const char *s = "string";
Pour le C++ je serais entièrement d'accord avec vous. Pour le C, j'ai tendance à donner un peu plus de marge de manœuvre, parce que, dans la pratique, il y a beaucoup de façons que les
const
pénètre dans votre chemin. (Qui est également connu comme const-intoxication)Si je suis à l'aide de louches bibliothèques, je suis d'accord avec vous (parfois). Si le code est sous mon contrôle puis-je y remédier de sorte que
const
ne va pas dans ma façon. L'alternative est de prendre des copies de chaînes qui doivent être transmis en tant que non-const paramètres de louches Api. Parfois, c'est possible, par exemple si la chaîne passée un littéral définis à proximité de l'appel, ou en tant que global, alors il suffit d'utiliser la première des deux options ci-dessus. D'autres fois c'est un pain PITA, auquel cas vous pouvez soit prendre le coup de strdup, ou jetéconst
(qui est "dangereux", mais alors vous êtes déjà à l'aide d'un "dangereux" de l'API).La deuxième version est très utile pour les tableaux de constantes chaînes de longueurs différentes ou l'inclusion des chaînes constantes au sein des structures (même si j'ai tendance à utiliser
const
dans la déclaration si je peux).Pourquoi ne peut-on pas modifier le second? - Je avoir une compréhension de base de la pile, de sorte s'il vous plaît être doux.
OriginalL'auteur Bart van Ingen Schenau
La différence entre ces deux:
est que l'un est en fait un tableau statique sur la pile, tandis que b est un pointeur vers une constante. Vous pouvez modifier le contenu d'un, mais pas b.
OriginalL'auteur Let_Me_Be
En plus des autres réponses, je vais essayer d'expliquer pourquoi vous ne pouvez pas modifier le
*s
variable plus tard sur le déroulement du programme.Conceptuellement lorsqu'un programme est chargé en mémoire, il dispose de 3 zones (segments):
Dans votre cas, la
s[]
variable est une variable locale (array), dans lemain()
fonction, qui est initialisé avec la valeur"string"
. Ainsi, il est stocké sur la pile et peut être modifié.La
*s
variable est un pointeur qui pointe vers l'adresse de"string\0"
, une constante situé dans le segment de code. Étant en lecture seule, vous ne pouvez pas modifier son contenu.OriginalL'auteur Andrei