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 :

aide sur les pointeurs


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut aide sur les pointeurs
    Bonjour, je débute en programmation langage C.

    la ligne de code qui me pose probleme est celle ci ;

    int puts (char const *);

    l'explication :

    " A première vue, le paramètre de cette fonction est une chaîne de caractères, En fait, c'est l'adresse de celle-ci. C'est pourquoi le paramètre de fputs() est défini comme un pointeur sur un type char. En effet, un pointeur est une variable qui peut contenir une adresse "


    j'ai beau lire et relire l'explication je ne comprend pas pourquoi puts demande un paramètre de type adresse. Est ce une convention ou plutot une histoire de lecture de flux ?

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Il faut connaitre quelques bases :

    1- En C, les arguments des fonctions sont toujours transmis par copie : Le paramètre de la fonction est une variable locale, qui est créée et initialisée par la valeur de l'argument correspondant au moment de l'appel à la fonction.

    2- Si on veut passer un tableau à une fonction selon le principe précédent, on devrait créer un nouveau tableau comme variable locale et l'initialiser avec les données du tableau en argument. Cela serait coûteux en occupation mémoire et en temps d'exécution (surtout si les tableaux sont volumineux). En conséquence, en C, on a choisi de ne pas avoir de tableaux en paramètres des fonctions.

    Il faut bien prévoir quelque chose pour qu'une fonction puisse accèder aux éléments d'un tableau. Connaissant l'adresse du premier élément, la taille d'un élément et le fait que les éléments sont consécutifs en mémoire, on peut retrouver l'adresse de n'importe lequel des éléments. Et si on connait l'adresse d'un élément, on peut lire ou modifier sa valeur.

    -L'argument transmis sera donc l'adresse du premier élément du tableau.
    Le paramètre correspondant dans la fonction sera donc du type "adresse d'un élément du tableau" ; ce sera un pointeur (objet qui est utilisé pour stocker des adresses)
    -La taille des éléments sera donnée par le type de ce paramètre
    -Et le fait que les éléments sont consécutifs en mémoire est une caractéristique des tableaux en C

    3- Conséquence
    Si l'argument d'une fonction désigne un objet tableau, alors la valeur de cet argument est l'adresse du premier élément du tableau.
    Plus généralement :
    si une expression désigne un objet tableau, alors la valeur de cette expression est l'adresse du premier élément du tableau SAUF dans deux uniques cas : cette expression est l'opérande de l'opérateur sizeof ou de l'opérateur unaire & (adresse de ). Dans ces deux cas seulement, la valeur de l'expression est l'objet tableau lui-même.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     void fonc(int * t)
    { // ici t est un pointeur sur int
    ...
    }
     int tab[10];
    ....
     fonc(tab);       // ici tab est l'adresse du premier élément 
                      // qui sera mise dans le paramètre t de fonc()
     i = sizeof tab ; // ici tab est le tableau et i vaut 10* sizeof(int)
    Note 1 : Si le paramètre t de la fonction est écrit comme int t[], alors cette déclaration est équivalente à int* t. C'est la seule situation (paramètre d'une fonction) où une notation tableau est équivalente à une notation pointeur.

    Note 2 : Une chaine de caractères en C est un tableau de char (terminé par la valeur 0). Donc elle obéit à toutes les caractéristiques des tableaux.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kenshin64 Voir le message
    j'ai beau lire et relire l'explication je ne comprend pas pourquoi puts demande un paramètre de type adresse. Est ce une convention ou plutot une histoire de lecture de flux ?
    Salut
    Le problème du C est qu'il ne sait pas manipuler une chaine de caractères de façon globale. En bref, si tu lui parles de "hello" il ne sait pas la prendre en compte dans son ensemble. Il ne peut la prendre en compte que caractère par caractère (le 'h', le 'e', le 'l', le 'l' et le 'o').
    Toutefois il te garanti que ces caractères sont en mémoire de façon contigüe. Ainsi si le 'h' se trouve à l'adresse 0x10, tu es certain que le 'l' sera à l'adresse 0x11 et etc.
    Donc quand une fonction doit traiter une chaine de caractères, il suffit de lui passer l'adresse mémoire de départ de cette chaine (ici 0x10). La fonction pourra aller ensuite voir à cette adresse la lettre qui s'y trouve (le 'h') puis incrémenter la valeur de cette adresse et traiter la lettre qui s'y trouve (le 'e') et etc etc.
    Implication: pour que la fonction sache où s'arrêter, il faut que la chaine possède un marqueur spécifique. Ce marqueur est le caractère '\0' (de valeur ascii 0). Donc quand la fonction trouve ce '\0', elle considère que la chaine est terminée et arrête sa boucle sur l'adresse reçue.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kenshin64 Voir le message
    int puts (char const *);

    l'explication :

    " A première vue, le paramètre de cette fonction est une chaîne de caractères, En fait, c'est l'adresse de celle-ci. C'est pourquoi le paramètre de fputs() est défini comme un pointeur sur un type char. En effet, un pointeur est une variable qui peut contenir une adresse "
    Avec les explications données ci-dessus, tu comprendras du coup que la phrase "En fait, c'est l'adresse de celle-ci" est bancale. Une chaine de caractère = un pointeur sur le premier caractère du tableau. C'est donc bien un pointeur sur un objet de type char.
    Et plus que "un pointeur est une variable qui peut contenir une adresse", je dirai qu'un "pointeur est une variable qui DOIT contenir une adresse" valide ou NULL.

Discussions similaires

  1. Besoin d'un peu d'aide sur les pointeurs.
    Par techz dans le forum Débuter
    Réponses: 9
    Dernier message: 18/04/2009, 16h32
  2. Besoin d'aide sur les pointeurs
    Par amateurc dans le forum Ada
    Réponses: 5
    Dernier message: 03/06/2008, 14h58
  3. Aide sur les pointeurs + char
    Par Deejoh dans le forum Débuter
    Réponses: 13
    Dernier message: 18/09/2007, 12h55
  4. besoin d aide sur un exercice sur les pointeurs
    Par azumachakib69 dans le forum C
    Réponses: 3
    Dernier message: 28/12/2006, 01h16
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19

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