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 :

pointeurs et passage de paramètres


Sujet :

C

  1. #1
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut pointeurs et passage de paramètres
    bonjour,je suis en train de relire mes tp de 1ere année et,n'étant pas très douée surtout avec les pointeurs,je rencontre quelques difficultés de compréhension.
    en effet le but du tp est de chercher le minimum et la maximum dans un tableau avec des entiers tirés aléatoirement dans[0,50]
    dans le main,on crée un tableau d'entiers,dont la taille est spécifiée dans le #define,puis trois variables de travail:min,max et statut de type entier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    voici les prototypage de fonction:
    void initialisationGenerateur();
    void remplirTableau(int leTableau[],int nombreElements);
    void afficherTableau(int leTableau[],int nombreElements);
    int minMaxTableau( int leTableau[], int nombreElements, int*rangMinimum, int*rangMaximum);
    les trois premières fonctions font intervenir une "copie" des variables(si j'ai bien compris),alors que la dernière intervient directement sur les adresses de variables grace aux pointeurs.
    cependant,toujours dans le main,lorsqu'on recherche le maximum et le minimum,on a la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    statut=minMaxTableau(monTableau,TAILLE,&min,&max);
    si je comprends,on met & du fait qu'on passe les adresses des variables min et max à cette fonction minMaxTableau,mais je ne comprends pas pourquoi on ne passe pas les adresses des autres paramètres pour cette fonction(celle du tableau monTableau entre autres)pour pouvoir travailler directement dessus au lieu d'en faire une copie...(j'ai d'ailleurs vu qu'il était laborieux de copier tout un tableau)
    voila,j'espère que j'ai été assez claire...merci d'avance

    voici la définition de la fonction minMaxTableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int minMaxTableau(int tab[],int nb,int *ptMin, int*ptMax)
    {
    int i;
    if(nb==0)
    return -1;
    *ptMin=*ptMax=0;
    for(i=1;i<nb;i++)
    if(tab[i]< tab[*ptMin])
    *ptMin=i;
    if(tab[i]> tab[*ptMax])
    *ptMax=i;
    }
    return 0;
    }

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Quand on passe un tableau en paramètre, il n'y a pas copie du tableau. Ce qui est passé est en fait l'adresse du premier élément du tableau.

  3. #3
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut
    en fait,dans cette fonction minMaxTableau,les deux premiers paramètres sont le tableau et le nombre d'éléments,tout comme dans toutes les autres fonctions ici.Mais dès lors qu'on passe un tableau en paramètre,on ne fait pas de copie?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 215
    Par défaut
    Salut,
    Pour être précis, le 1er. paramètre est une copie du pointeur sur le premier élément du tableau. Donc si on traduit, tu copies l'adresse du tableau (un entier) et tu accèdes directement à ton tableau (et non à une copie de celui-ci).
    Ensuite entre faire un passage par copie ou par pointeur, l'intérêt du passage par pointeur est de pouvoir modifier le paramètre et l'intérêt du passage par copie est de ne pas répercuter les modifications (effectuées sur le paramètre dans la fonction appelée) sur la donnée dans la fonction appelante (dans certains cas, on apprécie qu'il n'y ait pas de répercussions).

  5. #5
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut
    j'ai bien compris ce que vous m'avez expliqué sur l'adresse du 1er élément du tableau,mais dans le main,on a l'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    statut=minMaxTableau(monTableau,TAILLE,& min,& max);
    mais si on parlait de pointeur lorsqu'on passait le tableau,pourquoi n'aurait-on
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pas mis statut=minMaxTableau(&monTableau,TAILLE,&min,&max);

  6. #6
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Parce que montableau est déjà l'adresse du premier élément du tableau, pas besoin de mettre d'opérateur d'adresse (&) devant.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 215
    Par défaut
    En effet, si tu mets un &montableau, tu obtiens l'adresse du pointeur et non l'adresse du tableau qui est la valeur du pointeur.

  8. #8
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut
    j'ai bien compris ce que vous m'avez expliqué sur l'adresse du 1er élément du tableau,mais dans le main,on a l'instruction:
    statut=minMaxTableau(monTableau,TAILLE,& min,& max);
    mais si on parlait de pointeur lorsqu'on passait le tableau,pourquoi n'aurait-on pas mis statut=minMaxTableau(&monTableau,TAILLE,&min,&max);

  9. #9
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    montableau peut être considéré comme un pointeur sur le premier élément du tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    montableau <=> &montableau[0]

  10. #10
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut
    donc si je comprends,il y a quand même un passage d'adresse concernant le tableau du main,mais pourquoi serait-ce &monTableau[0] et pas & monTableau[TAILLE]?ne travaille t-on pas directement sur le tableau qu'on définit dans le main?
    d'ailleurs,pour les fonctions de remplissage et d'affichage,on passe également monTableau et la taille en paramètre.en fait je me demande si on passe ces paramètres,comme toute fonction ordinaire,ou justement vu qu'il s'agit d'une structure plus lourde,onétait forcé de passer le tableau du main directement

  11. #11
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Par défaut
    bonjour.
    Comme expliqué plus haut, MonTableau est un pointeur vers le premier élement du tableau. Ce qui te permet donc de modifier le premier element du tableau.
    Ensuite, MonTableau[i], accède au iem élément du tableau à partir de l'adresse du premier élément. Finalement tu peux donc modifier chaqsue éléments de ton tableau : MonTableau[i].
    Passer en parametre &MonTableau te permettrait de modifier MonTableau (le pointeur vers le tableau), pour, par exemple, libérer l'espace mémoire du tableau, réallouer l'espace mémoire, changer la taille du tableau etc, mais ce n'est pas ce que tu veux faire. C'est pourquoi tu passes juste MonTableau en paramettre et tu modifies les valeurs MonTableau[i].
    J'espere avoir été clair et t'avoir aidé.

  12. #12
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 215
    Par défaut
    &monTableau[0] est l'adresse de la 1ère. cellule de ton tableau (en aucun cas le 0 ne représente la taille de ton tableau ici).
    En outre, comme je te l'ai déjà dit (ce n'est peut-être pas très clair), tu travailles sur le même tableau, la seule chose que tu copies est le pointeur vers ce tableau.
    En gros un pointeur c'est un entier qui contient une adresse.
    te réserve un emplacement mémoire pour faire tenir TAILLE entiers et stocke l'adresse de cet emplacement dans montableau (qui n'est rien d'autre qu'un pointeur sur entier).

  13. #13
    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
    - nadsky :
    les trois premières fonctions font intervenir une "copie" des variables
    Les arguments d'une fonction sont sans exception toujours passés par valeur et les paramètres correspondants dans la fonction sont toujours des copies des arguments

    - giragu03 :
    Donc si on traduit, tu copies l'adresse du tableau (un entier)
    Une adresse n'est pas un entier : c'est une adresse. Son arithmétique est différente de celle des entiers.

    - giragu03 :
    En effet, si tu mets un &montableau, tu obtiens l'adresse du pointeur et non l'adresse du tableau qui est la valeur du pointeur.
    Deux cas :
    1- Dans une déclaration de tableau non dynamique (donc sans malloc ou assimilé) de forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     type monTableau[dimension]
    monTableau n'est pas une variable de type pointeur. monTableau est évalué comme une constante de type pointeur égale à l'adresse du premier élément du tableau. Son type est donc type*. On ne peut modifier monTableau.
    &montableau est du type "adresse d'un tableau" soit type (*) [] (avec les parenthèses) qui est un type différent de celui de monTableau. La valeur correspond à l'adresse du premier élément du tableau mais le type est différent. Ceci ne signifie pas prendre l'adresse d'une variable pointeur

    2- Dans une déclaration de tableau dynamique de forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     monTableau = malloc(dimension* sizeof type)
    monTableau est ici une variable pointeur qui doit être du type type * comme précédemment. Il est modifiable (si il n'est pas spécifié const)
    &monTableau est maintenant du type type ** et est bien la valeur de l'adresse du pointeur monTableau

    - Remarque sur la définition d'une fonction portant un tableau en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int minMaxTableau(int tab[],int nb,int *ptMin, int*ptMax){...}
    cette écriture est correcte mais peut induire en erreur et faire croire que tab est, dans la fonction, un tableau ce qui est inexact
    C'est un écriture équivalente à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int minMaxTableau(int * tab,int nb,int *ptMin, int*ptMax){...}
    qui montre bien que la variable locale tab est en fait un pointeur sur int.

  14. #14
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Jao,
    Citation Envoyé par giragu03
    &monTableau[0] est l'adresse de la 1ère. cellule de ton tableau (en aucun cas le 0 ne représente la taille de ton tableau ici).
    Il faut éviter de raconter n'importe quoi.
    est l'adresse de la 1ère cellule du tableau monTableau.

    [QUOTE=giragu03]En gros un pointeur c'est un entier qui contient une adresse. [/code]
    Vraiment en gros, alors.

  15. #15
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par droggo
    Il faut éviter de raconter n'importe quoi.
    Il n'y avait pas d'erreur: &monTableau[0] est l'adresse du premier élément du tableau. La valeur de cet élément est donnée par monTableau[0].

  16. #16
    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
    droggo
    Citation:
    giragu03 a écrit :
    &monTableau[0] est l'adresse de la 1ère. cellule de ton tableau (en aucun cas le 0 ne représente la taille de ton tableau ici).
    Ce qui est vrai
    quote=giragu03]En gros un pointeur c'est un entier qui contient une adresse. [/code]
    Vraiment en gros, alors.
    Non, pas en gros, c'est incorrect en gros et en détail

    stephl :
    La valeur de cet élément est donnée par monTableau[0].
    et je dirais même plus cet élément est monTableau[0].

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/02/2010, 16h24
  2. Réponses: 6
    Dernier message: 31/05/2008, 15h45
  3. Base pointeurs + passage de paramètre
    Par lyes312 dans le forum Langage
    Réponses: 2
    Dernier message: 31/01/2008, 22h47
  4. Passage de pointeur de vector en paramètre
    Par Chop_chop dans le forum SL & STL
    Réponses: 2
    Dernier message: 11/05/2007, 11h33
  5. Passage de paramètre par adresse, pointeur
    Par spileo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/01/2007, 19h00

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