[C] Que fait le code suivant ?

Que fait le code suivant ? [C] - C++ - Programmation

Marsh Posté le 10-11-2002 à 17:14:10    

Code :
  1. char *c[] = {
  2. "ENTER",
  3. "NEW",
  4. "POINT",
  5. "FIRST"
  6. };
  7. char **cp[] = {  c+3, c+2, c+1, c };
  8. char ***cpp = cp;
  9. main()
  10. {
  11. printf("%s", **++cpp );
  12. printf("%s ", *--*++cpp+3 );
  13. printf("%s", *cpp[-2]+3 );
  14. printf("%s\n", cpp[-1][-1]+1 );
  15. }


 
NB : je sais c'est connu, mais tjrs intéressant

Reply

Marsh Posté le 10-11-2002 à 17:14:10   

Reply

Marsh Posté le 10-11-2002 à 19:05:08    

[citation]Que fait le code suivant[/citation]
Mal à la tete...

Reply

Marsh Posté le 10-11-2002 à 19:12:23    

laisse moi reflechir....mmmm...
 
POINTER STEW
 
 :whistle:

Reply

Marsh Posté le 10-11-2002 à 19:20:44    

Il compile pas, il appelle à printf sans #include <kivabien>


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 10-11-2002 à 19:52:42    

kadreg a écrit a écrit :

Il compile pas, il appelle à printf sans #include <kivabien>



quel pinailleur celui là
il était pas destiné à êtr ecompilé

Reply

Marsh Posté le 10-11-2002 à 20:16:00    

après avoir encaissé un petit mal de crâne, je tombe sur POINTER STEW aussi...


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 10-11-2002 à 22:03:42    

Il est écrit comme ça, windows ??
Tout s'éclaircit, donc ... :D

Reply

Marsh Posté le 11-11-2002 à 03:54:26    

Code :
  1. main()

L'int implicte a été banni il y a combien de temps ?
Il va falloir que la génération qui a appris avant ça meure de viellesse ou quoi ?
 
Remarquons aussi que int implicite ou pas, il faut un return 0; en C.
 

Code :
  1. char *c[] = {

Enfin, remarquons que la notation hongroise est mal utilisée, ceci est un "apc" ou "asz".
 
Bref, j'en arrive à la même conclusion: "POINTER STEW".
 
Si quemlqu'un veut l'explication, il faut la demander gentiment.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 12-11-2002 à 10:29:46    

moi je voudraiq bien l'explication stp, g aboslument rien compris


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 12-11-2002 à 10:37:21    

je ne vais pas me risquer à une explication, mes connaissances du C ne sont plus ce qu'elles étaient et en plus je suis pas doué pour les explications de trucs aussi tordus :/


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 12-11-2002 à 10:37:21   

Reply

Marsh Posté le 13-11-2002 à 04:00:02    

Rappelons un peu d'arithmétique des pointeurs:
pointeur+i équivaut à &pointeur[i].
pointeur[i] équivaut à *(pointeur+i)
 
Et bien sûr, un tableau (a) utilisé dans une expression devient un pointeur sur son premier élément (&a[0]).
 
Dans cette explication, j'utilise comme nom pour case de tableau l'expression qui l'a initialisée, mise entre "guillemets".
"," signifie qu'une variable a été modifiée (-- ++)
":" signifie qu'on change d'objet dans l'expression

Code :
  1. //simples pointeurs
  2. char* s1= "ENTER";
  3. char* s2= "NEW";
  4. char* s3= "POINT";
  5. char* s4= "FIRST";
  6. //tableau de pointeurs
  7. char* c[]= {s1, s2, s3, s4 };
  8. //tableau de pointeurs sur pointeurs
  9. char** cp[]= {
  10. c+3, //pointeur sur "s4" dans c
  11. c+2, //pointeur sur "s3" dans c
  12. c+1, //pointeur sur "s2" dans c
  13. c    //pointeur sur "s1" dans c (c seul équivaut à c+0)
  14. };
  15. //pointeur sur pointeur sur pointeur
  16. char*** cpp= cp; //cp est pris comme pointeur sur "c+3" dans cp
  17. int main(void) //voici un beau main standard
  18. {
  19. printf("%s", **++cpp );
  20. //             ++cpp //incrémenter, cpp pointe alors sur "c+2" dans cp
  21. //            *      //déréférencer: "c+2" dans cp
  22. //           *       //déréférencer: "s3" dans c
  23. //affiche "POINT"
  24. printf("%s ", *--*++cpp+3 );
  25. //                ++cpp   //incrémenter, cpp pointe alors sur "c+1" dans cp
  26. //               *        //déréférencer: "c+1" dans cp
  27. //             --         //décrémenter, "c+1" pointe alors sur s1 dans c
  28. //            *           //déréférencer: "s1" dans c
  29. //                     +3 //équivaut à &s1[3]: pointeur sur le 2ème 'E' de "ENTER"
  30. //affiche "ER " (espace dans le format du printf)
  31. printf("%s", *cpp[-2]+3 );
  32. //            cpp[-2]   //équivaut à *(cpp-2): "c+3" dans cp
  33. //           *          //déréférencer: "s4" dans c
  34. //                   +3 //équivaut à &s4[3]: pointeur sur le 'S' de "FIRST"
  35. //affiche "ST"
  36. printf("%s\n", cpp[-1][-1]+1 );
  37. //             cpp[-1]       //équivaut à *(cpp-1): "c+2" dans cp (pointeur sur "s3" de c)
  38. //                    [-1]   //équivaut à *(&c[2]-1) == *&c[1] == c[1]: "s2" de c
  39. //                        +1 //équivaut à &s2[1]: pointeur sur le 'E' de "NEW"
  40. //affiche "EW\n"
  41. return 0; //pas l'oublier...
  42. }


"pointer stew" signifie "compote/ragoût de pointeurs".
 
Et voilà.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

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