IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

question de débutant sur les pointeurs.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    maz
    maz est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Août 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 18
    Par défaut question de débutant sur les pointeurs.
    Si l'on considère une fonction quelconque faisant une opération sur un string,
    par exemple une lecture de fichier, à un moment on peut utiliser soit :
    char *tampon;
    soit
    char tampon[long=une valeur suffisante];
    pour stocker les données sur lesquelles on va travailler...
    quelle est la différence ? Laquelle on utilise généralement et pourquoi?

    Merci d'avance...

  2. #2
    Membre éclairé Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    Citation Envoyé par maz
    Si l'on considère une fonction quelconque faisant une opération sur un string,
    par exemple une lecture de fichier, à un moment on peut utiliser soit :
    char *tampon;
    soit
    char tampon[long=une valeur suffisante];
    pour stocker les données sur lesquelles on va travailler...
    quelle est la différence ? Laquelle on utilise généralement et pourquoi?

    Merci d'avance...
    utilise char* tampon qd la taille de la zone que tu vas allouer est variable.
    utilise char tampon[n] qd la taille de ta string est fixe, neammoins evite dans ce cas là de déclarer à l'interieur de tes fonctions des chaines de caractères trop longues sinon tu risques d'exploser ta mémoire.

  3. #3
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par maz
    pour stocker les données sur lesquelles on va travailler...
    quelle est la différence ? Laquelle on utilise généralement et pourquoi?
    Quelques liens pour t'aider à comprendre:
    http://emmanuel-delahaye.developpez....s.htm#pile_tas
    allocation de mémoire

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par maz
    Si l'on considère une fonction quelconque faisant une opération sur un string,
    par exemple une lecture de fichier, à un moment on peut utiliser soit :
    char *tampon;
    soit
    char tampon[long=une valeur suffisante];
    pour stocker les données sur lesquelles on va travailler...
    quelle est la différence ? Laquelle on utilise généralement et pourquoi?
    Le premier cas est un pointeur non-initialisé. Je ne vois pas comment une fonction de lecture standard pourrait l'utiliser sans provoquer un comportement indéfini, vu que sa valeur est indéterminée. Par contre, un tableau de char d'une taille raisonnable, oui, c'est fait pour.

    3 ème cas que tu n'as pas évoqué :

    Donner une valeur valide au pointeur, par exemple en y stockant l'adresse d'un bloc alloué avec malloc().

    On utilise une taille fixe quand on connait la taille à la compilation, ou si la taille est raisonnable (pas plus d'une centaine de char).

    On utilise la mémoire allouée dans les autres cas.

  5. #5
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Je n'aurais pas dit mieux.

    Cependant, il y a tout de même quelque chose qui me tracasse, et c'est le côté "magique" que la plupart des profs de C (mais pas tous, hein !) donnent au "char *"... comme si c'était un type super-spécial, alors qu'il s'agit d'un vulgaire pointeur sur un caractère.

    Je te donnerais un autre conseil, si tu me le permets. Dès que tu peux utiliser des vecteurs (ou des tableaux), automatiques ou non, fais-le.

    En effet, si, par exemple après avoir initialisé la variable "char *tampon" par un appel à malloc(), tu accèdes aux éléments à la façon d'un vecteur (comme "tampon[i]" pour avoir le i_ème caractère), celà permet en général de rendre les choses plus compréhensibles, car on peut mieux apprécier la juste représentation physique de la chose. Surtout que, en général, il est fortement conseillé, d'après les fabricants de processeurs, de procéder de la sorte pour des questions d'optimisations, plutôt que via des pointeurs.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    Je n'aurais pas dit mieux.

    Cependant, il y a tout de même quelque chose qui me tracasse, et c'est le côté "magique" que la plupart des profs de C (mais pas tous, hein !) donnent au "char *"... comme si c'était un type super-spécial, alors qu'il s'agit d'un vulgaire pointeur sur un caractère.
    http://emmanuel-delahaye.developpez.....htm#char_star
    En effet, si, par exemple après avoir initialisé la variable "char *tampon" par un appel à malloc(), tu accèdes aux éléments à la façon d'un vecteur (comme "tampon[i]" pour avoir le i_ème caractère), celà permet en général de rendre les choses plus compréhensibles, car on peut mieux apprécier la juste représentation physique de la chose. Surtout que, en général, il est fortement conseillé, d'après les fabricants de processeurs, de procéder de la sorte pour des questions d'optimisations, plutôt que via des pointeurs.
    [] vs *, ça dépend complètement de l'implémentation. On ne peut affirmer quelque chose que si on a fait des mesures dans des conditions décrites et reproductibles.

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    En effet, si, par exemple après avoir initialisé la variable "char *tampon" par un appel à malloc(), tu accèdes aux éléments à la façon d'un vecteur (comme "tampon[i]" pour avoir le i_ème caractère), celà permet en général de rendre les choses plus compréhensibles, car on peut mieux apprécier la juste représentation physique de la chose. ...
    C'est vrai que ca peut être "plus parlant"
    ...Surtout que, en général, il est fortement conseillé, d'après les fabricants de processeurs, de procéder de la sorte pour des questions d'optimisations, plutôt que via des pointeurs.
    ??? sauf erreur de ma part, une expression telle que A[i] est interprétée et transcrite par le compilateur par *(A+i).
    Le compilateur ne s'interresse qu'à l'adresse des variables !
    Citation Envoyé par maz
    Si l'on considère une fonction quelconque faisant une opération sur un string,
    par exemple une lecture de fichier, à un moment on peut utiliser soit :
    char *tampon;
    soit
    char tampon[long=une valeur suffisante];
    pour stocker les données sur lesquelles on va travailler...
    On ne peut absolument pas utiliser char * Tampon pour stocker des caractères.

  8. #8
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Citation Envoyé par diogene
    ??? sauf erreur de ma part, une expression telle que A[i] est interprétée et transcrite par le compilateur par *(A+i).
    Le compilateur ne s'interresse qu'à l'adresse des variables !
    Non. A[i] est SEMANTIQUEMENT parlant équivalent à *(A + i)... mais au niveau compilation, il peut y avoir une grande différence, et ce à cause des modes d'adressage du processeur.

    Lorsque je parlais d'accéder aux valeurs d'un vecteur via la notation "vecteur" en tant qu'optimisation, je me réferrais surtout aux machines x86. On pourra faire des tests (mais avec les optimisations du compilateur activées) et/ou on pourra aussi aller voir ce qu'en pensent des fabricants comme AMD (lire leur manuel des optimisations).

Discussions similaires

  1. question de débutant sur les threads
    Par Virgile le chat dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 27/06/2007, 17h10
  2. [C#] question de débutant sur les threads?
    Par Jayceblaster dans le forum C#
    Réponses: 6
    Dernier message: 27/11/2006, 10h52
  3. question de débutant sur les jointures
    Par dreamcocktail dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/03/2006, 15h24
  4. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo