Passage par référence en C

Fermé
roger - 21 déc. 2009 à 21:49
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 21 déc. 2009 à 23:52
Bonjour,
j'ai le petite code suivant en C:
#include <stdio.h>

int *cinq(){
int g=5;
return &g;
}

int main(){
int *p;
p=cinq();
printf("La valeur pointée par p est %d\n", *p);
return 0;
}

Normalement le programme est censé m'afficher la valeur pointée par p est 5, mais il ne le fait pas car g est une variable locale, quelqu'un saurait comment arranger ça svp? Je souhaiterais faire un passage par référence dans la fonction cinq, c'est faisable?

merci
A voir également:

5 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
21 déc. 2009 à 22:16
Salut,

Déjà en C, il n'y a pas de passage par référence. Les références sont un concept purement C++.
Tu veux donc un vrai passage par référence en C++ ou un simple passage par pointeur ?

Cdlt,
1
un passage par argument, donc par pointeur fiddy...
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
21 déc. 2009 à 21:58
Un exemple court:
void cinq(int* p)
{
  *p = 5;
}

int main(void)
{
  int* p = malloc(sizeof(int));
  cinq(p);
  printf("La valeur pointée par p est %d\n", *p);
  return 0;
}
Bonne continuation.
0
salut loupius, je ne peux pas utiliser malloc, je dois garder la variable g et très peu modifier le main, en gros je pense que cinq() doit impérativement retourner une adresse....
0
Salut,
lami20j@debian:~/trash/AB$ cat a.c
#include <stdio.h>

int *cinq(){
  int a=5;
  int *g=&a;
  return g;
}

int main(){
  int *p=cinq();
  printf("La valeur pointée par p est %d\n", *p);
  return 0;
}
lami20j@debian:~/trash/AB$ gcc -Wall a.c
lami20j@debian:~/trash/AB$ ./a.out
La valeur pointée par p est 5
0
Salut lamij je me trompe peut etre mais où je ne vois aucun passage par référence dans ta fonction cinq()...?
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
21 déc. 2009 à 22:16
Pour une fois je ne suis pas d'accord avec toi.
Que la fonction retourne '&a' ou 'g', cela ne change rien; il est retourné l'adresse d'une variable locale qui n'aura plus aucun sens une fois la fonction terminée.
Il faut trouver autre chose, par exemple:
void cinq(int* p)
{
  *p = 5;
}

int main(void)
{
  int p;
  cinq(&p);
  printf("La valeur pointée par p est %d\n", p);
  return 0;
}
Bonne soirée.
0
roger > loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017
21 déc. 2009 à 22:19
loupius je dois garder la déclaration de int *p dans le main et ensuite p=...

en fait dans le p= je dois mettre l'adresse d'une variable tu es d'accord?
Donc la fonction cinq() doit renvoyer l'adresse d'une variable...
0
lami20j > roger
21 déc. 2009 à 22:20
Re,

Si je ne me trompe pas, tu ne sais pas ce que tu veux.
J'ai pris ton exemple et je l'ai modifié pour que ça marche, c'est tout.

Si tu veux un passage par adresse alors ta fonction doit contenir des paramètres (des pointeurs).
Ta fonction int *cinq() retourne un pointeur *int mais il n'y a pas des paramètres.
0
roger > lami20j
21 déc. 2009 à 22:25
lamij, en fait je souhaite un quelquechose de ce genre:

cinq(int *p1), elle renvoie une adresse, et comme ça dans le main je garde:

int *p;
p=cinq(); le cinq me renvoie une adresse, mais je me demande si c'est possible de garder ce genre de schéma car aucune de vos réponses ne ressemble à cela...
0
marven23 Messages postés 71 Date d'inscription samedi 11 juillet 2009 Statut Membre Dernière intervention 20 août 2013 2
21 déc. 2009 à 22:25
Bon soir,

Primo ton premier exemple est juste et il tourne : il affiche 5
Secondo, on parle du passage par réference que dans les arguments d'une fonction, mais dans ton exemple ceci n'est que le type de retour de la fonction qui est int*

Voici un exemple avec un passage par référence

#include <stdio.h>

void cinq(int * g){
*g=5; //On accède en ecriture pour modifier la valeur pointée par g
}

int main(){
int p;
cinq(&p); //On passe la réference &p : adresse de p comme l'exemple célebre scanf(...,&p)
printf("La valeur pointée par p est %d\n",p);
return 0;
}

Dans cet exemple on passe une réference sur p pour que la fonction puisse modifier sa valeur

@+
0
mon premier exemple est faux g est locale à la fonction...je ne peux pas le faire tourner...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
21 déc. 2009 à 22:33
Salut,
Il existe le mot-clé static.
Très moche, mais bon si c'est ce que tu veux ^^.
#include <stdio.h>

int *cinq(){
    static int g=5;
    return &g;
}

int main(){
    int *p;
    p=cinq();
    printf("La valeur pointée par p est %d\n", *p);
    return 0;
}
0