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 :

Pointer un tab multi-dimension


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 45
    Par défaut Pointer un tab multi-dimension
    Bonjour a tous,

    mon premier post sur ce forum, débutant en C.

    Je cherche a declarer et définir un pointeur vers un tableau de dimension nxm.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /* Declarations */
    int tab[2][2];
    int *p[2];
     
    /* Definition du tableau */
    tab[0][0]=1;
    tab[0][1]=2;
    tab[1][0]=3;
    tab[1][1]=4;
     
    /* Definition du pointeur */
    p[0]=tab[0];
    p[1]=tab[1];
    Derriere, je cherche à afficher les valeurs du tableau en bouclant sur le tableau de pointeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int i=0;
    while (i<4){
    printf("%d\n",*(p[0]+i));
    i++;
    }
    Le code fonctionne nickel mais quelque chose me chiffonne. Suis je obliger de passer par un tableau de pointeur (ici p[2]) dès que mon tableau de int dépasse 1 dimension? Pourquoi ne peut on pas faire un:
    et ensuite pour acceder aux valeurs de tab puisque tout est "aligné" dans la mémoire?

    Merci de lever le doute

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 525
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 525
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while (i<4){
    printf("%d\n",*(p[0]+i));
    eehhh cela ne m'étonnerait pas que tu aies des débordements de mémoire...

    en théorie c'est effectivement contigu si tu as un tableau de 2x2 tu vas adresser 4 adresses mémoires.
    Maintenant il faut voir dans la réalité...
    vérifie avec des points d'arrêts et débogue pas-à-pas , vérifie les adresses mémoires.
    Avec VC++ point d'arrêt ->F9 tu peux te positionner sur une zone mémoire avec l'adresse.

    Quand tu fais cette affectation,me semble-t-il
    p[0] pointe sur tab[0][0]=1 et tab[0][1]=2
    A vérifier en déboguant pas-à-pas


    Citation Envoyé par FabTheGeek Voir le message
    Suis je obliger de passer par un tableau de pointeur (ici p[2]) dès que mon tableau de int dépasse 1 dimension? Pourquoi ne peut on pas faire un:
    et ensuite pour acceder aux valeurs de tab puisque tout est "aligné" dans la mémoire?
    Merci de lever le doute
    A ce moment-là il faut utiliser un pointeur de pointeur p**.
    Un pointeur de pointeur p** pointera peut pointer sur un tableau à 2 dimensions

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je cherche a declarer et définir un pointeur vers un tableau de dimension nxm.
    Ce n'est pas ce que tu cherches à faire.
    Tu as une définition du genre
    si tu veux écrire p = tab, quel est le type de p ? C'est important, parce que l'arithmétique des pointeurs tient implicitement compte de la taille de l'objet pointé.
    Dans une telle expression, tab est, comme d'habitude, l'adresse du premier élément du tableau tab. Les éléments du tableau tab sont du type "tableau de M int" : int [M].
    Donc tab est du type "adresse d'un tableau de M int" : int (*)[M];
    p doit donc être de ce type (et pas du tout du type int**) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int (*p)[M] = tab  // avec les parenthèses
    Lorsque tu fais p++, tu passes du tableau tab[0] au tableau tab[1]



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i=0;
    while (i<4){
    printf("%d\n",*(p[0]+i));
    i++;
    }
    Dans ce code, p[0] (== tab[0]) est du type "adresse du premier élément du tableau tab[0]" soit int *.
    Il suffit donc d'un pointeur de ce type, un tableau n'est pas nécessaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int * p = tab[0];
    int i=0;
    while (i<4){
    printf("%d\n",*(p+i)); 
    // ou ce qui est équivalent printf("%d\n",p[i]);
    i++;
    }
    ceci revient à considérer le tableau à deux dimensions comme un tableau à une dimension.


    Mat.M :
    A ce moment-là il faut utiliser un pointeur de pointeur p**.
    Un pointeur de pointeur p** pointera peut pointer sur un tableau à 2 dimensions
    Non, il n'y a aucun rapport entre le nombre de dimensions et le nombre "d'étoiles".
    int ** p est à utiliser si p est un pointeur sur pointeur sur int (ou sur un élément d'un tableau de pointeurs sur int) , pas sur un tableau de tableaux de int.

Discussions similaires

  1. Web Methode ayant tab à 2 dimensions comme type de retour
    Par elouertassi dans le forum Services Web
    Réponses: 2
    Dernier message: 29/01/2007, 11h32
  2. [Tableaux] Tri d'un tableau multi-dimensions
    Par lodan dans le forum Langage
    Réponses: 6
    Dernier message: 05/12/2006, 10h08
  3. Réponses: 4
    Dernier message: 29/11/2006, 12h00
  4. Réponses: 3
    Dernier message: 06/10/2006, 15h46
  5. [Tableaux] Différence tableau multi dimension
    Par rdams dans le forum Langage
    Réponses: 3
    Dernier message: 20/04/2006, 11h34

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