Pointeurs et tableaux 2D en C

Résolu
Bonjour,
Je sais que l'équivalent en pointeur d'un tableau en 1 dimension donne quelque chose comme ça:
&tab[i] = tab
car tab seul est un pointeur sur le premier élément du tableau.

J'ai fait des test sur des tableaux en 2 dimensions et j'en ai conclu que l'équivalent de:
&tab[i][j] n'est pas tab
Je voudrais donc savoir quel est l'équivalent pour un tableau à 2 dimensions?

La raison est que je voudrais passer mon tableau 2D à une fonction et, question de simplifier l'écriture lorsque j'appellerai la fonction(car toujours écrire &tab[i][j] c'est moins pratique que juste écrire tab)(et sauver de la mémoire, tant qu'a y etre!), je voudrais simplement passer un pointeur qui pointe sur le premier élément.

Merci, j'espere que j'ai été assez clair :P
Configuration: Windows XP
Firefox 3.0.4

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. Je corrige :

    &tab[0] = tab

    tab[0] est le premier élément et & est l'opérateur d'adresse.

    Pour un tableau à deux dimension ça marche pareil,

    &tab[0][0] = tab

    Tu peux donc passer juste tab à ta fonction.
    Il faut par contre que le prototype de la fonction (sa définition) soit correcte.
    1. Un exemple :

      void zero(int **t)
      {
      int i,j;
      for(i=0; i<2; i++)
      for(j=0; j<3; j++)
      t[i][j]=0;
      };

      void main()
      {
      int tab[2][3];
      zero(tab);
      };

      Je l'ai pas compilé mais bon ça devrait être ok.
      1. Tu as parfaitement raison pour ce qui est de &tab[0] = tab et non &tab[i], merci de la correction :)

        Et j'avais fait un mauvais test pour vérifier l'équivalent, &tab[0][0] est bien équivalent a tab. Je l'avais bien deviné mais j'avais bloqué pour passer le tableau à une fonction, car j'obtiens les 2 warning suivants(ces warning sont obtenus avec la fonction test que tu m'a donnée, mais j'obtiens les même avec mes fonctions):

        warning C4047: 'function' : 'int ** ' differs in levels of indirection from 'int [2][3]'
        warning C4024: 'zero' : different types for formal and actual parameter 1

        Est-ce qu'il y a moyen de ne pas avoir ces warning?(ça marche quand même, mais ça m'irrite d'avoir des warning :P)
        1. Sans promesses, j'ai pas de compilo sous la main pour tester,

          Tu as deux choix, changer le prototype (j'en suis pas tout à fait certain) :

          void zero(int t[][])

          Ou alors lors de l'appel et mets :

          zero((int**)tab);

          Ce qui transforme ton tableau à deux dimension en un pointeur de pointeur.
        2. @Droopy_Si je change le prototype pour void zero(int t[][50]) (la 2e dimension doit etre mentionnée si je me souviens bien), est-ce que ça recopie tout le tableau ou seulement l'adresse de la première case?
        3. @jcl571Je sais pas trop.
          J'utilise toujours des pointeurs, comme ça je suis sûr ;-)
        4. @Droopy_C'est ce que j'aimerais faire, mais en plus d'être irritants, les warning sont fortement pénalisés lors de la correction ;)
        5. @jcl571Fais :

          int tab[2][3];

          void zero(int **t)
          {
          ...
          }

          void main()
          {
          zero( (int**) tab);
          }

          Et tu devrais plus avoir de warning.
      2. En fait, je ne me sers pas de tableaux de taille 2 et 3, c'était seulement comme exemple :) Mes tableaux sont des tableaux de chaines de caractères de taille 100x51 (des listes de noms et de prénoms).
        1. Contributeur
          Ca change rien. Tu fais passer toujours la taille et l'appel est le même ;)
        2. @fiddyJe sais :) En tout cas, merci pour tout! Résolu! :)