[C++] passage par pointeur

Résolu/Fermé
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 15 nov. 2006 à 17:33
mamiemando Messages postés 33076 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 avril 2024 - 16 nov. 2006 à 15:06
Bonjour,
Je m'en remet aux experts, parceque là je sèche...
j'ai une fonction :
void f(char* ch=0)
     {
       ch=new char[6];
      strcpy(ch,"essai");
      }

Dans le main, je fait :
char* ch="abcde";
f(ch);

en fesant des sorties ecran, ch vaut bien "abcde" avant la fonction f, MAIS aussi après !
Or en passant un pointeur je me serai attendu à ce que la valeur de ch soit modifer ! En fesant des sortie dans la fonction, ch est bien modifier.
J'ai donc fait les sortie des adresses. Il se trouve que l'adresse qui est passer à la fonction est différent de celle du main.
L'adresse est bien modifier dans f par l'opérateur new, mais la modif n'est pas reporter dans le ch du main.
Bref, c'est à perdre son C++ de base.
Pour moi, quand on passe un pointeur, on passe un pointeur !! et pas un nouvel objet créer spécialement pour la fonction et initialiser avec la valeur pointé par le pointeur passé en argument.

5 réponses

mamiemando Messages postés 33076 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 avril 2024 7 748
16 nov. 2006 à 15:06
Rappels sur les const

Il ne faut pas confondre un :
const char * (la chaine pointée est constante)
char * const (le pointeur est constant)
const char * const (les deux sont constants)

Pour ton problème...

Je rappelle qu'en C++ tu peux utiliser les référence et encore mieux les std::string :
#include <string>

void f(std::string & s=""){
  s = "essai";
}


Références et pointeurs

A noter que en C et en C++ les paramètres sont des recopies.
- un passage par pointeur va consister à empiler l'adresse de la variable pointée. Cette adresse est recopiée en mémoire mais pas la zone pointée. C'est pour ça qu'en C / C++ on utilise des pointeurs ou des références pour modifier la valeur d'un paramètre (plus exactement la valeur d'une variable pointée par un paramètre).
- on doit au maximum utiliser les références pour que le programme ne perde pas du temps à recopier inutilement des paramètre. Par exemple si je manipule un graphe de grande taille :
void f(graph_t & g); // rapide
void g(graph_t * g); // rapide
void h(graph_t g): // lent !!! car on recopie le graphe à chaque appel de h


Et les const...

Il faut par ailleurs veiller à bien mettre les const (cf début du post) quand ils sont justifiés. Typiquement :
#include <string>
#include <iostream>

void affiche(std::string & s){
  std::cout << s << std::endl;
}

void affiche2(const std::string & s){
  std::cout << s << std::endl;
}

int main(){
  const std::string s = "plop";
  affiche(s); //erreur de compilation car affiche de garantit pas la constance
  affiche2(s); //ok
  return 0;
}

Bonne chance
1
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
15 nov. 2006 à 18:04
Il faut signaler que tu veux updater et donc reprendre la nouvelle valeur dans ton main, sinon, comme tu as peu le voir, la valeur dans le main ne changera pas pour ta variable 'ch', mais uniquement en local, dans ta fonction.
En C, je sais qu'il suffit de placer un '&' dans l'appel de fonction, juste devant la variable a reprendre, c'est à dire 'ch' pour toi :

char* ch="abcde";
f(&ch);


Mais je crois qu'en C++ les pointeurs sont gérés différemment non ?
En tout cas ton erreur viens de là, essai ca avec des sorties et ca devrait aller mieux.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
16 nov. 2006 à 10:29
Salut.
Merci de ta réponse, mais comme je m'y attendai, si tu met f(&ch) le compilateur te dit qu'il ne peut convertir char** en char*
en effet, si ch est un (char*) &ch est un (char**)
je ne comprend pas. ce problème plus un autre me fait douter de mon compilateur . gcc 3.2.3
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
16 nov. 2006 à 12:49
J'ai trouvé la solution !
En fait, j'ai mal regarder, la valeur du pointeur est bien passer.
Or un passage par pointeur permet de modifier la valeur pointé, par contre dans f(char* g) g est bien une nouvelle variable prenant comme valeur la valeur du pointeur (l'adresse) par contre si dans la fonction on modifie ce 'g', l'effet ne ce fait pas sentir sur la variable passer en argument. En revanche modifié *g modifiera la valeur pointer par la variable passé à la fonction.
Et en fait, quand on fait char * f="essai", f pointe vers un "const char", il est alors impossible de modifié '*f' (en tout cas c'est la conclusion que je tire de l'erreur de segmentation lorsque je fait f[0]='f').
Au final, comme préconiser par tout le monde, il faut bien faire :
char*ch; strcpy(ch,"essai"); (et oui, on me l'avai bien dit)
en esperant avoir été à peu près clair
0

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

Posez votre question
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
16 nov. 2006 à 14:00
Exact :)
0