fonction retournant un pointeur ( c++)

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous, J'ai une question à propos des fonctions retournant un pointeur , par exemple dans la fonction suivante :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
vector<int> *retourner_tableau(vector<int> *t)
{
  return t;//On retourne l’adresse du tableau 
}

int main()
{
   vector<int> tableau;
   retourner_tableau(tableau)->push_back(5);//Si retour_tableau() retourne une adresse pourquoi peut on utiliser l'opérateur -> comme s'il s'agissait d'une variable de type pointeur ?
}

Merci d'avance pour vos réponses,bonne journée :).

+0 -0

En C++ (que je ne connais pas trop), on préfère parler de référence, dans ton cas la solution suivante serait préférable

1
2
3
4
vector<int> & retourner_tableau(vector<int> & t)
{
  return t;
}

Avec une fonction exécutée de cette manière

1
retourner_tableau(tableau).push_back(5);

Maintenant si je me trompe, n'hésitez pas à modifier…

+1 -0

Merci de ta réponses mais ce que j'ai du mal à comprendre c'est que la fonction retourne la valeur du pointeur c'est à dire son adresse .Lorsqu'on l'appelle elle retourne par exemple 0x79956. Et comment peut on utiliser l'opérateur "->" alors qu'il s'agit d'une adresse et non d'un pointeur.

+0 -0

Effectivement comme le dit Dominus, ton prototype est le suivant

1
vector<int> *retourner_tableau(vector<int> *t);

ce qui veut dire que ta fonction retourner_tableau prend en paramètre l'adresse d'un vector et retourne l'adresse d'un vector.

L'opérateur d'indirection dans cette situation est tout à fait justifier…

EDIT: Il semblerait que dans l'exécution de retourner_tableau, tu oublies l'esperluette & !

+0 -0

Dominus ,tu veux dire que le compilateur considère l'adresse comme un pointeur ? Et d'après certaines sources ils disent que la valeur retournée par retourner_tableau(tableau) est contenu dans un "Temporary Object" du même type que la variable retournée car elle n'est pas pas copiée dans une variable. Donc apparemment si j'ai bien compris comme le compilateur "voit" que la valeur retournée par retourner_tableau n'est pas copié dans une variable il va la stockée dans une variable temporaire du type vector<int> * .

+0 -0

EDIT: Il semblerait que dans l'exécution de retourner_tableau, tu oublies l'esperluette & !

Non. Il n'y a pas de niveau d'indirection supplémentaire, il prend un pointeur en paramètre et retourne un pointeur. Pas besoin de &.

Effectivement en C++ on préfère en général les références quand on peut les utiliser. En plus des pointeurs sur des conteneurs standards c'est somme toute assez rare il me semble.

L'avantage des références est qu'on a la garantie qu'une référence ne pointe jamais sur NULL (nullptr en C++11/14). ON pourrait d'ailleurs se poser la même question, comment se fait-il que l'opérateur point peut être utilisé dans ce cas ?

La réponse, en fait techniquement la valeur retournée par la fonction n'est ni plus ni moins qu'une variable temporaire (une rvalue pour les puristes sauf erreur), et en sa qualité de variable, elle peut participer à n'importe quelle expression valide.

+1 -0

Dominus ,tu veux dire que le compilateur considère l'adresse comme un pointeur ?

giba25

Un pointeur est une variable qui contient l'adresse d'une autre. Renvoyer un pointeur, c'est renvoyer une adresse.

Et tes sources sont correctes, tu donne à ta fonction un pointeur qui vaut 0x79958, elle te renvoie un autre pointeur, temporaire, qui vaut la même valeur, 0x79958. 0x79958 c'est l'adresse, les variables qui enregistrent l'adresse sont des pointeurs. On écrit "on retourne l'adresse du tableau" parce que c'est plus court que "on renvoit un pointeur qui contient l'adresse du tableau". On n'écrit pas non plus "on renvoie un entier qui contient le nombre de joueurs", mais simplement "on renvoie le nombre de joueurs".

EDIT: Il semblerait que dans l'exécution de retourner_tableau, tu oublies l'esperluette & !

Non. Il n'y a pas de niveau d'indirection supplémentaire, il prend un pointeur en paramètre et retourne un pointeur. Pas besoin de &.

QuentinC

On est bien d'accord qu'on parle du 1er code présenté par le PO ?

1
2
3
4
vector<int> *retourner_tableau(vector<int> *t)
{
  return t;//On retourne l’adresse du tableau 
}

Car si je teste chez moi ça ne compile pas !

En gros tu dis que ça compile

1
2
3
4
5
6
7
8
9
int main(void)
{
   vector<int> tableau;
   retourner_tableau(tableau)->push_back(5);

    // suite

   return 0;
}

Alors que moi je dis que ça compile

1
2
3
4
5
6
7
8
9
int main(void)
{
   vector<int> tableau;
   retourner_tableau(&tableau)->push_back(5); // la différence

    // suite

   return 0;
}
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte