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 :

le double pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Par défaut le double pointeur
    bonjour

    je trouve dans pas mal de codes des fonctions avec double pointeur.
    pourquoi on utilise parfois les doubles pointeurs ?
    pourquoi on fait l'appel des ces fonction dans le programme initial avec les adresse des variables ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void permuter(char **u,char **v)
    {
    	char *w;
    	w=*u;
    	*u=*v;
    	*v=w;
    }
    et l'appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    int trier(char *t,char *p[])
    {
    	int n,i,k,j;
    	n=init(t,p);
    	for(i=0;i<n-1;i++)
    	{
    		k=i;
    		for(j=i+1;j<n;j++)
    		   if(comparer(p[j],p[k])<0)
    					    k=j;
    					if(k!=i)
    					  permuter(&p[i],&p[k]);
    		}
    	return n;
    }

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Par défaut
    Un double pointeur, c'est un pointeur qui pointe vers un pointeur. Sâchant qu'un tableau dynamique en C n'est finalement qu'un pointeur sur le début du tableau, les doubles pointeurs sont souvent des pointeurs sur des tableaux dynamiques. Mais ils peuvent être aussi des tableaux dynamiques de tableaux dynamiques , ce qui finalement revient au même

    Dans le cas que tu cites, tu vois char **. Si tu sais que char * est une chaîne de caractères, alors char ** est un pointeur sur une chaîne de caractère, ou un tableau dynamique de chaîne de caractère.

    Est-ce plus clair ?

  3. #3
    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
    Citation Envoyé par dev0712 Voir le message
    je trouve dans pas mal de codes des fonctions avec double pointeur.
    pourquoi on utilise parfois les doubles pointeurs ?
    pourquoi on fait l'appel des ces fonction dans le programme initial avec les adresse des variables ?
    D'une manière générale, si on veut qu'une fonction puisse modifier la valeur d'une variable de type T, on passe l'adresse de cette variable à la fonction via un pointeur sur T (T*). Les pointeurs n'échappent pas à la règle.

    Dans l'exemple donné, T est un type pointeur (char *). On utilise donc un T*, soit un char * *

    http://emmanuel-delahaye.developpez....difie_variable

  4. #4
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Par défaut
    Bonjour

    Merci pour votre attentions.

    mais il me reste des lacunes a propos de ce sujet.j'ai modifie les codes pour utilise uniqument un seule pointeur mais le programme ne fonctionne pas?

    avant de diffuse ce sujet j'ai fait beaucoup de recherche mais aucune réponse et monque de document !

    voici le code modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void permuter(char *u,char *v)
    {
    	char *w;
    	w=*u;
    	*u=*v;
    	*v=w;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int trier(char *t,char *p[])
    {
    	int n,i,k,j;
    	n=init(t,p);
    	for(i=0;i<n-1;i++)
    	{
    		k=i;
    		for(j=i+1;j<n;j++)
    		   if(comparer(p[j],p[k])<0)
    					    k=j;
    					if(k!=i)
    					  permuter(p[i],p[k]);
    		}
    	return n;
    }

    je vous remerci encore pour les réponses.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Heo,
    Citation Envoyé par dev0712 Voir le message
    mais il me reste des lacunes a propos de ce sujet.j'ai modifie les codes pour utilise uniqument un seule pointeur mais le programme ne fonctionne pas?
    ...
    je vous remerci encore pour les réponses.
    En lisant calmement les réponses précédentes, tu devrais comprendre pourquoi ça ne marche pas comme tu l'as modifié.

  6. #6
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Par défaut
    bonjour

    en faite j'ai lu vos messages attentivement mais j'ai pas bien compris,même avec des cours du pointeur c'est pas facile a comprendre utilité de double pointeur,aussi dans votre excellent cours sur votre site web j'ai pas trouve de grand chose.

  7. #7
    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
    Citation Envoyé par dev0712 Voir le message
    en faite j'ai lu vos messages attentivement mais j'ai pas bien compris,même avec des cours du pointeur c'est pas facile a comprendre utilité de double pointeur,aussi dans votre excellent cours sur votre site web j'ai pas trouve de grand chose.
    Je pense que si tu n'en comprends pas l'intérêt maintenant, c'est que tu n'en as pas l'usage pour le moment. Ca viendra avec l'expérience. Pour le moment, contente toi de bien comprendre ce qu'est un pointeur. Le jour où une fonction devra modifier ce pointeur, tu verras à quoi sert le pointeur de pointeur ...

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    Par défaut
    Citation Envoyé par dev0712 Voir le message
    bonjour

    en faite j'ai lu vos messages attentivement mais j'ai pas bien compris,même avec des cours du pointeur c'est pas facile a comprendre utilité de double pointeur,aussi dans votre excellent cours sur votre site web j'ai pas trouve de grand chose.
    Peut-être prends-tu le « double pointeur » pour un type de données particulier. En fait, tu peux enchaîner des pointeurs autant de fois que tu le souhaites. Tu peux avoir des triples pointeurs, des quadruples, etc.

    Un pointeur est l'adresse en mémoire de quelque chose. Ceci suffit donc à définir son format (celui d'une adresse) mais comme il pointe quelque chose, il faut en plus indiquer le type de ce « quelque chose ». Cela peut être un int, un char, un float, etc. , ce qui donnerait respectivement int *, char * ou float *, ou ... un autre pointeur ! Dans ce cas-là, ça donne « ** ». Mais il faut définir alors le type de la donnée pointée par cet autre pointeur et là, on retombe dans le même cas de figure. Donc, au final, cela forme toujours une suite d'étoiles plus ou moins longue, terminée à chaque fois par un type qui n'est pas un pointeur.

    Maintenant, quand tu vois « char ** arg », il s'agit en fait souvent, mais pas systématiquement (c'est important), de « char * arg [] », autrement dit, d'une liste de chaînes de caractères. En Java, par exemple, tu trouverais « String [] » à la place.

    Pourquoi cette notation ? Parce que les « chaînes de caractères » sont, comme leur nom l'indique, une suite de caractères alignés les uns derrière les autres, suite dont la longueur n'est pas connue a priori. Pour la transmettre, on ne va pas passer les caractères eux-mêmes mais, à la place, l'emplacement en mémoire du début de la chaîne pour que le programme qui en a besoin puisse aller la lire. Donc, on passe un pointeur vers un caractère (le premier de la chaîne) : « char * ».

    Ensuite, on souhaite passer plusieurs chaînes de caractères (typiquement, une liste d'arguments). On va donc mettre les pointeurs vers chacune des chaînes de caractères dans un grand tableau, donc la taille n'est pas non plus connue a priori (nombre variable d'arguments).

    Le problème est donc exactement le même : à la place, on passe un pointeur vers le début du tableau. Le pointeur en question pointe donc le pointeur vers la première chaîne de caractères. D'où « char ** ».

    Par extension, si tu avais envie de passer plusieurs listes d'arguments, alors la problématique serait la même une fois de plus et tu aurais « char *** ».

    Tu peu te former dans les cours et tutoriels pour bien apprendre la programmation en langage C : http://c.developpez.com/cours/

Discussions similaires

  1. Double pointeurs dans les listes chainées
    Par NouK32 dans le forum Débuter
    Réponses: 8
    Dernier message: 10/02/2008, 18h19
  2. double pointeur dans un fichier txt
    Par micka180 dans le forum VBScript
    Réponses: 14
    Dernier message: 22/01/2008, 16h23
  3. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  4. Réponses: 6
    Dernier message: 04/01/2007, 01h30
  5. double pointeur?
    Par ostralo dans le forum C++
    Réponses: 17
    Dernier message: 23/02/2006, 18h24

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