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 :

paramètre formel et paramètre courant !


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Août 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 2
    Par défaut paramètre formel et paramètre courant !
    J'ai debuté mon apprentissage du langage C, il y a maintenant un
    moment. Seulement, cela fait 2 ans que j'ai arrété ( et oui 2 ans de prepa
    ). J'ai donc repris presque à zero avec un peu plus de rigueur il y a 2
    semaines.

    Ma question porte sur le lien entre paramètre formel et paramètre
    courant :

    D'aprés ce que j'ai compris pour une fonction utilisant des variables
    normales ( pas des pointeurs ), la définition de la fonction ce fait sous la
    forme :
    void fonction( int a, int b) { ... } par exemple

    lorsque l'on appelle cette fontion, l'instruction s'ecrit sous la forme :
    fontion(5, 7) ; par exemple

    L'affectation des entiers 5 et 7 avec les variables locales a et b est sous
    entendu -> int a = 5 ; int b = 7 ;

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

    Maintenant si je veux modifier les valeurs des paramètres, je doit passé
    par les pointeurs et donc utiliser une fonction dit "de référence".
    la fonction s'écrit sous la forme :

    void fonction(int *ptr_a, int *ptr_b) { ... } par exemple

    je veut modifier la valeur des variables : int a ; int b ; à l'aide de la
    fonction ci-dessus, pour cela j'appelle cette dernière fonction de la
    manière suivante :

    fonction(&a, &b) ;

    Cette foi ci, l'affectation sous entendu est la suivante :
    int *ptr_a = &a ; int *ptr_b = &b ;

    Cependant *ptr_a et *ptr_b sont des entiers, et &a et &b sont des
    adresses mémoires, il s'agit donc de deux groupes d'éléments appartenant
    à deux ensembles différents, les affections précédentes n'ont pour moi
    aucun sens !
    l'affectation sous entendu serait plutot :
    int ptr_a = &a ; int ptr_b = &b ;

    Aidez moi à comprendre le lien entre paramètre formel et paramètre
    courant. Cela est encore pour moi trés obscure !

  2. #2
    Membre expérimenté
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Par défaut Re: paramètre formel et paramètre courant !
    Citation Envoyé par Aioros
    Cette foi ci, l'affectation sous entendu est la suivante :
    int *ptr_a = &a ; int *ptr_b = &b ;
    Oui, à comprendre comme : (int *) ptr_a = &a et non comme int (*ptr_a) = &a. Autrement dit, on affecte au pointeur ptr_a l'adresse de a, ce qui est cohérent, et non "on affecte à l'entier *ptr_a l'adresse de a" comme tu sembles l'avoir compris.

    Ca va mieux ?

    Edit : correction de fautes

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour et bienvenue sur les forums de developpez

    Citation Envoyé par Aioros
    Cette foi ci, l'affectation sous entendu est la suivante :
    int *ptr_a = &a ; int *ptr_b = &b ;
    En fait le * fait partie du type et n'est pas ici l'opérateur de déréférencement, certains préfére écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* ptr_a = &a ; int* ptr_b = &b ;
    Mais dans ce cas, si on utilise l'opérateur virgule pour faire plusieurs déclaration sur une seul ligne, il est facile d'oublier le * :
    parait correcte or, il faut écrire :
    J'espère avoir été clair

  4. #4
    Candidat au Club
    Inscrit en
    Août 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 2
    Par défaut
    merci pour ces deux réponses rapides !
    j'y vois déjà beaucoup plus clair, je peux continuer mon apprentissage sereinement !

    Longue vie à ce Forum manifique !

  5. #5
    Membre expérimenté
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Par défaut
    N'oublie pas le bouton (ni de lire les règles du forum si ce n'esst déjà fait).
    A bientôt sur developpez

  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 Re: paramètre formel et paramètre courant !
    Citation Envoyé par Aioros
    Ma question porte sur le lien entre paramètre formel et paramètre
    courant :
    Gni ?
    D'aprés ce que j'ai compris pour une fonction utilisant des variables
    normales ( pas des pointeurs ), la définition de la fonction ce fait sous la
    forme :
    void fonction( int a, int b) { ... } par exemple
    Oui.
    lorsque l'on appelle cette fontion, l'instruction s'ecrit sous la forme :

    fontion(5, 7) ; par exemple
    Oui, par exemple. On peut aussi mettre une variable ...

    fontion(x, 7) ; par exemple

    De toutes façon, en C, seule la valeur est transmise.

    L'affectation des entiers 5 et 7 avec les variables locales a et b est sous
    entendu -> int a = 5 ; int b = 7 ;
    Mmm.... 'variable locale' est un terme un peu osé. Ce sont des paramètres, et, oui, on peut les assimiler à des variables locales par leur comportement. Mais les modifier n'impacte pas la valeur originale dans l'appelant).
    -------------------------------------

    Maintenant si je veux modifier les valeurs des paramètres, je dois passer
    par les pointeurs et donc utiliser une fonction dit "de référence".
    Arg! Non! Pas de réference en C. Comme d'habitude, on passe une valeur. Sauf qu'ici, on passe une adresse (c'est une valeur comme une autre). Comme les seules variables qui savent prendre une valeur de type 'adresse' sont les pointeurs, on met un pointeur (du même type que la variable dont on passe l'adresse).
    la fonction s'écrit sous la forme :

    void fonction(int *ptr_a, int *ptr_b) { ... } par exemple
    Ok.
    je veut modifier la valeur des variables : int a ; int b ; à l'aide de la
    fonction ci-dessus, pour cela j'appelle cette dernière fonction de la
    manière suivante :

    fonction(&a, &b) ;
    Oui. Les valeur passées sont les adresses des deux variables. (résultat de l'opérateur &)
    Cette foi ci, l'affectation sous entendu est la suivante :
    int *ptr_a = &a ; int *ptr_b = &b ;
    Ce que tu montres est une définition avec initialisation. Elle est correcte. Mais ce n'est pas une affectation, qui serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ptr_a = &a ; 
    ptr_b = &b ;
    Cependant *ptr_a et *ptr_b sont des entiers, et &a et &b sont des
    adresses mémoires, il s'agit donc de deux groupes d'éléments appartenant
    à deux ensembles différents, les affections précédentes n'ont pour moi
    aucun sens !
    Ok. La confusion vient de ce que le m^meme signe (*) a 2 sémantiques différentes selon le contexte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int *ptr_a = &a ; 
    int *ptr_b = &b ;
    pourrait s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int *ptr_a = &a ; 
    int *ptr_b = &b ; 
     
       ptr_a = &a ; 
       ptr_b = &b ;
    Le '*' signifie que l'on définit un pointeur. Ne pas confondre avec l'opérateur '*' qui sigifie 'déréférencer un pointeur' (càd accéder à la valeur pointée).
    l'affectation sous entendu serait plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ptr_a = &a ; int ptr_b = &b ;
    Argh, non !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptr_a = &a ; ptr_b = &b ;
    A apprendre par coeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       extern T var; /* declaration */
       T var;        /* defintion[ incluant une declaration] */
       T var = 123;  /* defintion[ incluant une declaration] avec initialisation */
     
       var = 123;    /* affectation*/
    http://emmanuel-delahaye.developpez....tm#definitions

  7. #7
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut Re: paramètre formel et paramètre courant !
    Citation Envoyé par Aioros
    et oui 2 ans de prepa
    [...]
    il s'agit donc de deux groupes d'éléments appartenant à deux ensembles différents, les affections précédentes n'ont pour moi aucun sens !
    On voit bien que t'as fait prépa toi

    Nas'

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/01/2011, 21h06
  2. Réponses: 9
    Dernier message: 21/04/2009, 17h30
  3. Le type du paramètre formel 1 est incomplet
    Par KaNDeL dans le forum Débuter
    Réponses: 6
    Dernier message: 19/11/2008, 11h32
  4. Les paramètres formels
    Par Adorien dans le forum Développement
    Réponses: 0
    Dernier message: 24/04/2008, 10h49
  5. paramétres formels de main incompris
    Par sanatou dans le forum C++
    Réponses: 4
    Dernier message: 01/12/2006, 18h02

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