[C/C++] Difference entre pointeur et double pointeur ?

Difference entre pointeur et double pointeur ? [C/C++] - C++ - Programmation

Marsh Posté le 05-07-2009 à 03:19:59    

Hello,
 
Je voudrai savoir la différence (s'il y en a une), entre:
 

Code :
  1. char *toto[];


et

Code :
  1. char **toto;


 
Merci!

Reply

Marsh Posté le 05-07-2009 à 03:19:59   

Reply

Marsh Posté le 05-07-2009 à 14:43:23    

ta première ligne n'est pas valide

Reply

Marsh Posté le 05-07-2009 à 15:20:52    

autrement la différence , est que dans t'as première forme, il y a une notion de const

Reply

Marsh Posté le 05-07-2009 à 16:53:59    

Biensur que si...
 

Code :
  1. int main(int argc, char *argv[])

Message cité 1 fois
Message édité par leo42 le 05-07-2009 à 16:56:46
Reply

Marsh Posté le 05-07-2009 à 16:56:10    

lol non

Reply

Marsh Posté le 05-07-2009 à 16:56:57    

Si ;)
 
Et mieux, tu peux faire...
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.   char **foo = argv;
  4. }


 
D'où ma question sur la différence...


Message édité par leo42 le 05-07-2009 à 16:57:48
Reply

Marsh Posté le 05-07-2009 à 16:59:24    

tu avais mis un ";"  ton expression n'était pas valide


Message édité par Glock 17Pro le 05-07-2009 à 16:59:34
Reply

Marsh Posté le 05-07-2009 à 17:02:26    

Ok, oui, dans ce contexte elle ne l'est pas...
 
Maintenant ma question n'a toujours pas de réponse...

Reply

Marsh Posté le 05-07-2009 à 17:09:05    

bah je t'ai répondu char*p[] pointe sur des données constantes, tu ne pourras pas faire p[0]='x', c'est équivalent  à const char **p

Message cité 1 fois
Message édité par Glock 17Pro le 05-07-2009 à 17:10:47
Reply

Marsh Posté le 05-07-2009 à 22:50:29    

on dirait que si...
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3. printf("Avant: %s\n", argv[0]);
  4. argv[0] = "Modif";
  5. printf("Apres: %s\n", argv[0]);
  6. }


 
Compilera sans warning (avec -Wall), et donnera:
 

Code :
  1. Avant: r:\ee.exe
  2. Apres: Modif

Reply

Marsh Posté le 05-07-2009 à 22:50:29   

Reply

Marsh Posté le 06-07-2009 à 00:52:57    

argv[0] = "Modif";..... mais biensûr t'en as d'autre des comme ça ?

Reply

Marsh Posté le 06-07-2009 à 01:42:59    

Glock 17Pro a écrit :

bah je t'ai répondu char*p[] pointe sur des données constantes, tu ne pourras pas faire p[0]='x', c'est équivalent  à const char **p


 
je ne vois pas de constance ici. Je vois juste un tableau de pointeurs sur char. c'est sur qu'on ne peut pas faire p[0]='x' parce qu'il manque un niveau d'indirection, ni p[0] = "une chaine" car le litéral est constant, mais rien n'empêche ici de changer les valeurs du tableau.
 
pour en revenir à la question de leo42, si c'est dans le prototype d'une fonction, comme tu en prends l'exemple avec argv, avoir char **argv ou char *argv[] ne change rien. Par contre, dans le corps d'un programme, char *t[] et char **p ont bien des comportements différents. On a eu un sujet récemment où il était question des différences entre tableau et pointeur, une petite recherche devrait te permettre de le retrouver.


---------------
last.fm
Reply

Marsh Posté le 06-07-2009 à 07:55:49    

theshockwave a écrit :


 
je ne vois pas de constance ici..


 
bah si tout de même, car cette expression doit etre initilaisé avec quelquechose de constant

Reply

Marsh Posté le 06-07-2009 à 10:38:01    

Glock 17Pro a écrit :


 
bah si tout de même, car cette expression doit etre initilaisé avec quelquechose de constant


 
Je vois bien ce que tu veux dire, mais ton exemple n'est pas vraiment probant, puisque, même si tu fais un char*p[] = { "123", "456" };, rien ne t'empêche de faire pointer p[0] ailleurs par la suite. Effectivement, après, modifier la chaine pointée, c'est une autre question.


---------------
last.fm
Reply

Marsh Posté le 06-07-2009 à 13:04:31    

leo42 a écrit :

Hello,
 
Je voudrai savoir la différence (s'il y en a une), entre:
 

Code :
  1. char *toto[];


et

Code :
  1. char **toto;


 
Merci!


 
Dans la portee globale:
Dans le premier cas tu as une "tentative definition" d'une variable de type
tableau de pointeur vers char.  
 
Dans le second, tu as une "tentative definition" d'une variable de type
pointeur vers pointeur vers char.
 
Une "tentative definition" est une definition s'il n'y a pas d'autres
definitions (avec un initialiseur) ou une declaration externe.  Dans le cas
du tableau, la taille est fixee a un.
 
Dans une portee de fonction.
 
Dans le premier cas tu as une erreur car le type n'est pas complet.
Dans le second cas, tu as une definition d'une variable de type pointeur
vers pointeur vers char.
 

leo42 a écrit :

Biensur que si...

Code :
  1. int main(int argc, char *argv[])



 
Dans le cadre de la liste des arguments d'une fonction, le niveau superieur
de tableau est designe en fait un pointeur.  Il n'y a pas de difference
avec

Code :
  1. int main(int argc, char **argv)


 

Glock 17Pro a écrit :

autrement la différence , est que dans t'as première forme, il y a une notion de const


Il n'y a pas de const qui intervienne ici.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 06-07-2009 à 13:22:43    

+1

Reply

Marsh Posté le 24-07-2009 à 11:14:06    

Au lieu de créer un topic je demande ici. Je n'arrive pas à comprendre quel est l'utilité d'utiliser l'adresse mémoire d'une variable (le pointeur si l'ai bien compris) au lieu d'utiliser directement la variable.
Ca change quoi dans le code ?

Reply

Marsh Posté le 24-07-2009 à 11:28:58    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed