Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pointeur de pointeur de pointeur?

Sujet résolu
    26 juin 2020 à 15:20:55

    Salut,

    Je m'entraine un peu sur les pointeurs etc.

    L'idée c'est une fonction qui va changer la valeur d'un double dans un tableau qui est dans un tableau qui lui même est dans un tableau.

    Mon code fonctionne, j'arrive bien à changer mes valeurs mais je ne comprends pas pourquoi entre chaque tableau je dois "sauter" un nombre.

    void	ddpointe(double ***bats)
    {
    	bats[0][0][0] = 0;
    	bats[0][1][0] = 1;
    	bats[0][1][1] = 2;               ---> Je suis dans tabB[1]
    
     	*(**(bats + 0) + 4) = 3; 	// tabC[0]  ------> Je passe à bats + 4?
    	*(**(bats + 0) + 5) = 4; 	// tabC[1]
    	*(**(bats + 0) + 6) = 5;	// tabC[2]  --------> même chose ici + 6
           	*(**(bats + 0) + 8) = 6;	// tabD[0]  --------> la je passe à + 8
    	*(**(bats + 0) + 9) = 7;	// tabD[1]
    	*(**(bats + 0) + 10) = 8;	// tabD[2]
    	*(**(bats + 0) + 11) = 9;	// tabD[3]
    
    	
    }


    Je n'arrive pas à saisir pourquoi? Est-ce au niveau de la mémoire que cela se joue?

    J'ai fais un tableau histoire d'essayer de comprendre et vous montrer mon raisonnement (attention ça va peut être piquer le cerveau...)

    Pourquoi passer de +6 à +8 alors que c'est la "case" d'à côté?

    Pareil pour le passage de taB à tabC?

    Merci pour le coup de main!

    • Partager sur Facebook
    • Partager sur Twitter
      26 juin 2020 à 15:54:10

      Salut comment as-tu fais ton allocation pour ton tableau?
      Si c’est un malloc tu as du faire comme ça en gros:

      double tableau = malloc(size * sizeof(double**));
      for(int i = 0; i < size; i++){
           tableau[i] = malloc(size * sizeof(double*);
      .....

      En gros au début de chaque bloc mémoire que ton malloc va allouer il va y avoir un header du malloc

      La valeur que tu vas trouver en +7 correspond donc à la valeur du header du malloc suivant.

      • Partager sur Facebook
      • Partager sur Twitter
        26 juin 2020 à 15:59:01

        Salut,

        Je n'utilise pas encore malloc (j'en suis pas là)

        J'ai fait comme ça:

        #include <stdio.h>
        #include "ddpointe.h"
        
        int	main(void)
        {
        	double	tabA[1] = {0};
        	double	tabB[2] = {0};
        	double	tabC[3] = {0};
        	double	tabD[4] = {0};
        	double 	*tabs[4] = {tabA, tabB, tabC, tabD};
        	double	**bats[1] = {tabs};
        
        	ddpointe(bats);
        	return (0);
        }

        tu as tout mon code sauf le .h avec le proto de la fonction.


        Merci!

        Je crois que j'ai trouvé, comme mon double vaut 8 octets, je dois "sauter" les 8 octets car je n'ai pas fais d'allocation ?! -----> En fait non, ça colle pas.



        -
        Edité par UnDeuxTwa 26 juin 2020 à 16:18:46

        • Partager sur Facebook
        • Partager sur Twitter
          26 juin 2020 à 17:40:12

          Salut,
          C'est assez tordu comme exercice ...
          Il faut prendre en compte que tes pointeurs sont des adresses. Combien d'octets occupe chaque pointeur?
          Je t'invite, si tu veux l'essayer, à afficher chaque pointeur avec le format %p.
          Affiche sizeof(double *( Ce sera la même valeur pour sizeof(double **) ou sizeof(double ***)
          Ce sont tous des pointeurs.
          Si tu es sur un processeur 32-bits, la valeur sera 4 (4 octets), et si tu es sur un processeur 64-bits, ce sera 8.
          Tu peux essayer d'afficher (avec le format %p)  &tabA  à  &tabD  pour comparer les valeurs.
          Tu peux afficher pour comparer sizeof(int) et sizeof(double). Ce ne sont pas des pointeurs.
          C'est l'espace qu'occupent un int et un double.
          Autre considération, tes 4 tableaux de base n'ont pas la même longueur: de 1 à 4 nombres (doubles).
          Après cela, tu devrais pouvoir comprendre ...
          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            27 juin 2020 à 12:42:12

            Dans ce genre d'exercice, il faut ABSOLUMENT faire un dessin

            Mais c'est le genre d'exercice inutile et en réalité contre-productif.  La difficulté avec les pointeurs, c'est pas de faire un truc tordu pour le plaisir de se demander ensuite combien il faut d'étoiles pour faire un truc qui ne sert strictement à rien. Tout ça pour se la péter avec des "triple pointeurs", chose qui n'a aucun intérêt (ils disparaissent si on a l'idée de se servir de typedef).

            Ce qui est utile en réalité, c'est de savoir QUAND il faut se servir de pointeurs pour faire des choses utiles, et quand s'en abstenir.

            -
            Edité par michelbillaud 27 juin 2020 à 12:45:39

            • Partager sur Facebook
            • Partager sur Twitter
              27 juin 2020 à 16:07:18

              -

              -
              Edité par edgarjacobs 27 juin 2020 à 16:10:11

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                27 juin 2020 à 17:52:34

                Ce qui est contre productif c'est de ne pas expérimenter (à condition de savoir ce qu'on fait et d'assumer ses échecs ...).
                «Je n’ai pas échoué mille fois. J’ai simplement découvert mille façons de ne pas faire une ampoule électrique.» - Thomas Edison
                Si le PO expérimente avec 7 '*' et réussit son test, cela prouvera qu'il a compris les pointeurs.
                J'apprend actuellement le Python (rien à voir avec C ...) et je ne me contente pas de la solution proposée.
                Je compare la mienne avec la sienne et j'en essaie d'autres.
                J'ai régulièrement des erreurs, mais je sais en tirer profit.
                J'ai donné des suggestions au PO pour l'aider à mieux comprendre ce qu'il faisait. S'il les suit, il en saura plus sur le sujet.
                Et tant pis si les applications seront inutiles. Sa compréhension, elle, ne sera pas inutile.
                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  27 juin 2020 à 21:43:51

                  Mais qu'est-ce que peut bien apprendre avec

                  *(**(bats + 0) + 6) = 5; 

                  Il y a juste un jeu d'écritures, à partir de l'équivalence entre *(p +i)  et p[i]

                  *(**(bats + 0) + 6)
                  *(*  bats[0]   + 6)
                  
                  (*bats[0]) [6]
                  
                  

                  c'est purement du calcul, ça n'apporte aucune compréhension.




                  -
                  Edité par michelbillaud 27 juin 2020 à 21:47:54

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 juin 2020 à 1:12:22

                    Ce que j'ai voulu dire n'est pas que j'encourage de faire ce genre de chose.
                    Je dis seulement que, si on décide de le faire, il faut le faire en connaissance de cause, dans un but d'apprentissage et avec les outils adéquats.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                      28 juin 2020 à 7:43:23

                      Salut!

                      Merci pour vos réponses! J'ai compris!

                      Je suis d'accord sur le fait que ça n'a pas d’intérêt, c'était simplement pour être sûr de bien avoir compris les pointeurs, j'en fais un peu tous les jours juste histoire de ne pas me perdre, j'ai mis un peu de temps à comprendre cette notion donc je la répète, bêtement pour bien l'intégrer.

                      Merci à vous pour votre aide!

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Pointeur de pointeur de pointeur?

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown