Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Messages recommandés

Posté(e)

Argh, je ne comprends plus rien !

 

Je mets ça :

__________

#include "stdafx.h"

#include <iostream.h>

 

char c;

int main(int argc, char* argv[])

{

while (cin >> c)

{

cout << c;

}

return 0;

}

¯¯¯¯¯¯¯¯¯¯

Là, c'est OK, sauf qu'il n'y a pas de retour à la ligne.

Et j'ai pas mis de char*

Question : comment ajouter un "n" à la fin de la chaîne, et non pas après chaque caractère ?

Le transfert se fait-il toujours caractère par caractère ? (excusez si je m'exprime mal)

 

Autre question : y-a-t-il quelqu'un qui voudrait bien m'expliquer le fonctionnement des pointeurs ? (c'est assez compliqué dirait-on)

Pourquoi ma boucle plante avec char* et non pas avec char ?

 

Un char est un caractère, un char * est un pointeur vers un caractère (c'est à dire que c'est en fait un entier qui contient l'adresse mémoire à laquelle est stocké ton caractère !)

 

Je ne saisis toujours pas la différence. Il faut que je stocke un caractère en mémoire avant d'utiliser un pointeur qui le "pointe" ?

Désolé, mais je ne comprends pas.

 

 

Pourtant ya écrit "débutant" sur le bouquin !

Posté(e)

char désigne 1 caractère (le compilateur réserve l'espace mémoire dans l'espace code et la taille est statique)

char * désigne un pointeur (le compilateur réserve l'epace mémoire pour un pointeur dans l'espace code, le pointeur renvoie dans l"espace mémoire du programme et la taille du contenu de char* (comprendre vers ce qu'il pointe) peut faire 0,1 ou n de longueur)

de plus une "chaine en C++" doit comporter un caractère 0 en fin de chaine sinon quand tu fait un cout << c il te liste le contenu de ta mémoire de l'adresse pointée vers le premier chr(0) qui passe.

 

Pourtant ya écrit "débutant" sur le bouquin !
ben oui :-( les pointeurs sont a la base de la compréhension du C/C++ une fois cela passé ca passe tout droit :P
Posté(e)

Ha, c'est à dire que quand j'aurais compris, ça ira tout seul !

Ben alors j'ai pas compris ! lol

 

"le pointeur renvoie dans l'espace mémoire du programme"

Pour moi c'est toujours du chinois.

Je ne comprend pas l'intêret d'un pointeur. Que pointe-t-il ?

Si char* pointe vers un caractère, quel est l'avantage par rapport à char ?

Pourquoi pointer un caractère au lieu d'utiliser une variable non-pointeur qui contiendrait le même caractère ???

 

Cette notion de pointeur m'échappe...

 

Prenons un exemple concret :

 

char* c;

char c;

 

Quelle est la subtilité ?

 

 

En tous cas, merci pour ta réponse. :P

Si quelqu'un pouvait m'éclairer sur le sujet, ce serait super !

(le chapitre sur les pointeurs n'explique quasiment rien, je suis donc censé tout savoir ?!?)

Posté(e)
Pourquoi pointer un caractère au lieu d'utiliser une variable non-pointeur qui contiendrait le même caractère ???

dans le cas ou tu souhaite utilisé char pour 1 caractère le pointeur n'a aucun intérêt.

 

Je ne comprend pas l'intêret d'un pointeur. Que pointe-t-il ?
il pointe dans un coin de la mémoire qui contient la valeur du type de donné pointée

 

sinon pour la subtilité char* et char, on va revenir au bon vieux temps du dos pour ce mettre en condition, il fut un temps ou les programme avait une limite constituée par la mémoire conventionnelle (les 640Ko) quand tu execute le programme le code va se "decompresser" dans cette memoire conventionnelle, ce qui fait que si tu n'as pas assez de memoire de libre le programme refuse de se lancer voila l'utilité du pointeur, image tu veux une chaine de 3200 caractères, si tu utilise une définition non pointée (char c[3200];) ton programme va prendre 3200 octets de plus dans cette espace, alors que si tu utilise un pointeur, dans l'espace memoire tu n'aura pas 3200 octets de plus mais la taille du pointeur.

Posté(e)

En effet, c'est po evident a expliquer l'histoire des pointeurs. Je vais quand meme essayer, on ne sait jamais :-P

 

Alors ... Il etait une fois .... heuuu, non, c'est pas ca :P

 

Donc, on va commencer par expliquer comment un ordinateur travaille avec la mémoire.

Toute la mémoire de ton ordinateur est indéxée et chaque octet de cette mémoire a une adresse unique.

Quand ton programme s'execute, lui il ne connait que des adresses mémoire.

 

Exemple pour aider :


int main()

{

char c1;

char *c2;



c1 = 'A';

c2 = &c1;

cout << c1;

cout << *c2;



return 0;

}

 

Attention pour les valeurs d'adresse je simplifie à l'extreme mais on est la pour faire comprendre les pointeurs et je ne veux pas entrer dans les details pour brouiller tout.

 

Donc pour ton programme, ta variable 'c' est a l'adresse 1 et 's' a l'adresse 2 dans la mémoire

C1 est une valeur de type caractere (char)

c2 est un pointeur (une adresse) sur un char

 

Quand tu affectes 'A' à c1, ton programme met la valeur 'A' à l'adresse 1 de la mémoire

Quand tu affectes &c1 à c2, ton programme prend l'adresse de c1 (c'est a dire 1) et la met à l'adresse 2 (l'adresse de la variable c2). Donc c2 = 1.

Quand tu fais cout << *c2, ton programme prend la valeur de c2 (c'est a dire 1) et concidere (parce qu'on lui a demandé avec l'étoile : *) que c'est l'adresse à laquelle il va pouvoir trouver ca valeur qu'il doit utiliser. Donc il prend la valeur qui se trouve à l'adresse 1. CAD la valeur de c1, CAD 'A'.

 

Les 2 cout renvoient donc 'A'.

 

Tu es donc d'accord avec moi que c2 est une adresse vers un char. c2 permet de pointer vers un index mémoire qui contient un char. D'ou le nom de pointeur.

 

Tu vas me dire que ca ne sert pas à grand chose dans l'exemple si dessus mais ce n'est qu'un exemple simple. On va compliquer un peu pour faire comprendre l'intérêt de la chose.

 

Prenons cet exemple :


int main()

{

char *s;

int nbre;



cout << "Entrez le nombre de caracteres a saisir :";

cin >> nbre;

s = new char[nbre + 1];



for (int i = 0; i < nbre; i++)

{

 cout << "entrez un caractere : "

 cin >> s[i];

}

s[nbre] = 0;

cout << 'n';

cout << s;

}

 

quand tu fais s = new char[nbre + 1]; tu demandes au systeme de ta machine de te réserver un emplacement mémoire pour mettre 'nbre + 1' variables de type char dans un espace contigue et de te renvoyer l'adresse comme valeur de ta variable s.

 

Grace à cette adresse, tu as l'index de base qui te permet de travailler avec tes 'nbre + 1' variables de type char.

Ton programme lui, ne connait que des adresses donc pour lui :

adresse de s[index de la variable] = valeur de s + ('index de la variable' * taille de la variable)

 

Dans notre cas, si l'adresse te renvoie l'adresse 192 dans s :

adresse de s[0] = 192 + (0 * 1) = 192

adresse de s[1] = 192 + (1 * 1) = 193

adresse de s[2] = 192 + (2 * 1) = 194

etc ....

 

* Chaines de caractères :

Le type caractère existe en C++ mais pas le type Chaine de caractère.

En C++, une chaine de caractères est un tableau de variables char avec le dernier caractere de la chaine etant à zero.

D'ou la ligne :

s[nbre] = 0;

dans mon exemple ci-dessus.

 

---------------------------

Note : j'ai pas de compilo C++ sous la main donc il est possible qu'il y ait des coquilles dans les exemples. Surtout que j'ai plus l'habitude au C qu'au C++. Si c'est le cas, j'en suis navré :-(

 

J'espère que ca a pu t'aider. Ce n'est pas un concept trés simple mais une fois qu'on a compris ca, le C et le C++ c'est du beurre a comprendre.

 

Automne

Posté(e)

Merci beaucoup à tous les deux !! :P

Je regarderai ça ce soir avec plus d'attention.

 

Simple précision, automne, quand tu mets

s = new char[nbre + 1];

La valeur de la variable est mise sur le tas, non ?

Et il faut donc supprimer la variable du tas après que l'on s'en soit servi, avec :

delete [] s;

(dis moi si je me trompe)

 

Et, dernière question, dans mon bouquin, pour écrire une chaîne de caractère, il y a écrit (exemple) "chaîne"

Et pour un caractère, ils mettent 'A'

Pourquoi cette différence de guillemets ? Est-ce que ça a la même signification ? Ou y-a-t-il une différence ?

 

 

Dites-moi si j'abuse :-( Mais je veux comprendre...

Posté(e)
Merci beaucoup à tous les deux !! :P

Je regarderai ça ce soir avec plus d'attention.

 

Simple précision, automne, quand tu mets

s = new char[nbre + 1];  

La valeur de la variable est mise sur le tas, non ?

Et il faut donc supprimer la variable du tas après que l'on s'en soit servi, avec :

delete [] s;

(dis moi si je me trompe)

 

Et, dernière question, dans mon bouquin, pour écrire une chaîne de caractère, il y a écrit (exemple) "chaîne"

Et pour un caractère, ils mettent 'A'

Pourquoi cette différence de guillemets ? Est-ce que ça a la même signification ? Ou y-a-t-il une différence ?

 

 

Dites-moi si j'abuse :-( Mais je veux comprendre...

 

Pour le new, en effet j'ai oublié le delete :-P il faut bien liberer la mémoire.

 

Il y a bien une différence entre cotes et guillemets. Pour ecrire un caractére on utilise les cotes ' et pour les chaines de caractère on utilise les guillemets ".

 

Si tu ecris "A" ton programme interprete ca comme une chaine de 2 caractères. Le premier est 'A' le second zero : 0. Et attention c'est bien 0 et pas '0'.

"ABC" c'est aussi equivalent à {'A', 'B', 'C', 0}

 

Automne

Posté(e)

Hum, y-a-t-il quelqu'un qui pourrait me dire pourquoi ça ne marche pas ?

J'ai bien compris le fonctionnement des pointeurs, maius je n'arrive jamais à me corriger !

 

#include "stdafx.h"

#include <iostream.h>



void mafonction(int *mavar1);



void main(int argc, char* argv[])

{

int mavar2 = 5;

mafonction(&mavar2);

cout << mavar2;

}



void mafonction(int *mavar1)

{

mavar1 = 10;

}



Ça m'affiche :

 

truc.cpp(19) : error C2440: '=' : cannot convert from 'const int' to 'int *'

Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

Error executing cl.exe.

 

Un autre truc, il sert à quoi stdafx.h ?

Posté(e)

Y a un pb dans mafonction. Ca devrait etre ca :

 


void mafonction(int *mavar1)

{

  *mavar1 = 10;

} 

 

StdAfx.h c'est un include qui contient les entetes des fonctions et classes systèmes Windows.

 

Automne

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...