2009-06-05 6 views
1
int main() 

{ 
    char *second= new char("hello"); 
    char *first="hi"; 
    char third[]="new"; 
} 

Je suis nouveau à C++ et ne comprends pas vraiment comment fonctionne char, pourquoi le premier donnent une erreur de compilation, et quelles sont les différences de ces 3 voie de déclaration, la force et les avantages de le déclarant d'une manière particulière.allouée dynamiquement omble

Merci

Hmm, comme quelqu'un mentionne que la deuxième forme est en lecture seule, pourquoi aurais-je le changer. Je suppose que le code ci-dessous

int main() 

{ 
    char *second= new char("hello"); 
    char *first="hi"; 
    char third[]="new"; 
    first="world"; 
} 
Code

comme ci-dessus exécutera encore, pourquoi est-il si? , alors quelle forme est préférable si je veux lire une entrée mais ne connais pas la taille de la chaîne?

Répondre

12

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

+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

+0

Merci. ajouté quelques autres choses –

+0

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

1

permet d'essayer d'expliquer dans le code:

// your code 
char *first="hi"; 
// this is the memory location of the string, assigned by the compiler 
// sizeof(first) == sizeof(char*) == 4 (usually, lets not get into this right now) 
char *first = 0x12345; 


// your code 
char third[]="new"; 
// means, the following: 
char third[4]; 
third[0] = 0x6E; // ascii code of 'n' 
third[1] = 0x65; // ascii code of 'e' 
third[2] = 0x77; // ascii code of 'w' 
third[3] = 0x00; // strings in C end with NULL 
// note that sizeof(third) is still sizeof(char*), but this 
// time you statically allocated sizeof(char)*4 for the whole array 

Plus lecture pour vous:

Questions connexes