2017-09-10 26 views
-4

Rookie C++ avec le Code question.Using: Blocs 16,01 compilateur GNU GCC. Merci d'avance. Code;C++ Char comportement pointeur Array vs pointeur de chaîne Array

#include <iostream> 
using namespace std; 

int main(){ 
    char charArr[]="Hello"; 
    cout<<charArr<<endl; //outputs Hello. 

    string strArr[]={"Hello", "Stack", "overflow"}; 
    string *pStrArr=strArr; //pointer to strArr; same as &strArr[0]. 
    cout<<*pStrArr<<endl; //Derreferencing pointer , outputs Hello 

    char charArr1[]="Hello"; 
    char *pCharArr1=charArr1; /*pointer to charArr1.(charArr cout was Hello, not H, therefore i assumed we are storing in memory Hello);*/ 
    cout<<*pCharArr1<<endl; /*dereferencing, outputs H, not Hello as i expected. */ 

    return 0; 
} 

Observation; sorties de charArr Bonjour, donc j'ai supposé que créer un pointeur et le déréférencer devrait produire le bonjour; La sortie réelle est H, ce qui semble incompatible avec le comportement observé sur une chaîne de caractères, alors que le premier élément est à la fois pointé et déréférencé.

Question est: Il est clair que je suis à défaut de comprendre tableau de caractères. J'apprécierais une explication de ce qui précède dans (autant que possible) des termes simples.

PS: a bien utilisé la fonction de recherche et a parlé du canard. Merci pour votre temps. +++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++ une fois que toutes les réponses que je me rends compte de la question réelle devrait être pourquoi les lignes 2 et 4 produisent des sorties différentes, strArr étant une adresse mémoire (se comporte comme un pointeur) tandis que le charArr affiche le contenu du tableau.

string strArr[]= {"hello","world","how", "are","you"}; 
cout<<strArr<<endl;//outputs 0x28fedc. 

char charArr[]="Hello"; 
cout<<charArr<<endl; // outputs hello 

Merci

+0

Vous semblez conscient du fait que 'char * pCharArr1 = charArr1,' dans 'pCharArr1' égal' & charArr1 [0] '. Par conséquent, '* pCharArr1' est équivalent à' charArr1 [0] '- un seul caractère. Si vous imprimez 'cout << charArr1 [0]', vous verrez également un seul caractère 'H'. Je ne sais pas pourquoi vous êtes surpris par le comportement. –

+0

N'utilisez pas de tableaux raw frickin '! _ "PS: a utilisé la fonction de recherche et a parlé au canard Merci pour votre temps." _ Parlez à votre canard plus loin! – user0042

+0

Vous avez besoin d'un [bon livre C++] (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) –

Répondre

1

Dans ce extrait de code

char charArr1[]="Hello"; 
char *pCharArr1=charArr1; /*pointer to charArr1.(charArr cout was Hello, not H, therefore i assumed we are storing in memory Hello);*/ 
cout<<*pCharArr1<<endl; /*dereferencing, outputs H, not Hello as i expected. */ 

l'objet pCharArr1 est de type char *. Il pointe sur le premier caractère de la chaîne "Hello" stocké dans le tableau charArr1. En déréférençant le pointeur, vous obtiendrez un objet du type char qui est le caractère pointé par le pointeur. C'est le caractère 'H'.

Dans ce extrait de code

string strArr[]={"Hello", "Stack", "overflow"}; 
string *pStrArr=strArr; //pointer to strArr; same as &strArr[0]. 
cout<<*pStrArr<<endl; //Derreferencing pointer , outputs Hello 

l'objet pStrArr est de type std::string * et des points à un objet du type std::string. En déréférençant le pointeur, vous obtiendrez un objet du type std::string qui contient la séquence de caractères "Hello". Ainsi, dans cette déclaration

cout<<*pStrArr<<endl; //Derreferencing pointer , outputs Hello 

cette séquence est sortie.

Ainsi, dans cette déclaration

cout<<charArr<<endl; //outputs Hello 

charArr est de type char * (le désignateur tableau est implicitement converti en pointeur sur son premier élément).

Dans cette déclaration

cout<<*pCharArr1<<endl; /*dereferencing, outputs H, not Hello as i expected. */ 

*pCharArr1 est de type char.

Et enfin dans cette déclaration

cout<<*pStrArr<<endl; //Derreferencing pointer , outputs Hello 

*pStrArr est de type std::string.

Prenez en compte que pour ces déclarations

char charArr1[]="Hello"; 
char *pCharArr1=charArr1; /*pointer to charArr1.(charArr cout was Hello, not H, therefore i assumed we are storing in memory Hello);*/ 

la sortie de ces états

cout<<CharArr1<<endl; 

et

cout<<pCharArr1<<endl; 

sera le même et sera égal à la sortie de la chaîne "Hello"

Toutefois, pour ces déclarations

cout<<*CharArr1<<endl; 

et

cout<<*pCharArr1<<endl; 

un seul caractère 'H' sera émis.

Dans la première déclaration comme il a été mentionné le désignateur tableau est converti implicitement pointeur sur son premier élément dans l'expression *CharArr1

+0

Donne un sens Vlad & Igor, en regardant char charArr [] = "Bonjour"; comme l'équivalent char charArr [] = {'H', 'e', ​​'l', 'l', 'o'} je suis en train de pointer sur le premier caractère, qui est 'H' ... je suppose que je J'ai du mal à comprendre (et à formuler comme une question inteligible) pourquoi cout << charArr << endl; // sorties Bonjour, si vraiment charArr est équivalent à charArr [0] (qui est 'H'). Merci pour toutes les réponses. – RookieCplusplus

+0

@RookieCplusplus Cette déclaration charArr [] = "Hello"; est équivalent à la déclaration suivante charArr [] = {'H', 'e', ​​'l', 'l', 'o', '\ 0'} ;; –

+0

@RookieCplusplus Chaque instruction avec l'opérateur << renvoie l'objet spécifié dans le côté droit. Si le type de l'objet est char, un caractère est généré. Si le type de l'objet est std :: string, la chaîne stockée dans l'objet est sortie. –