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 :

Forme (*tableau)[indice] - Comprendre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Pgs
    Pgs est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Par défaut Forme (*tableau)[indice] - Comprendre
    Bonjour,

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef int* TabInt;
    TabInt tabintok;
    tabintok= (TabInt)calloc(10, sizeof(int));
    Si je passe ensuite &tabintok en paramètre d'une fonction, cette dernière ne peut pas le modifier avec *tabintok[indice] mais peut le faire avec Je ne comprends pas pourquoi *tabintok[indice] ne fonctionne pas et surtout je ne comprends pas la forme (*tabintok)[indice].

    Pouvez-vous m'expliquer ?

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2019
    Messages : 21
    Par défaut
    Comme expliqué ici, la précédence des opérateurs est définie de telle sorte que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *tabintok[indice] = *(tabintok[indice])
    puisque la précédence de l'opérateur [] est supérieur à celle de *. Donc, afin de changer la précédence, on doit mettre des parenthèses comme on le fait de même dans les expressions arithmétiques.

    Mais si tu veux modifier les éléments de tabintok, passer tabintok et non &tabintok est suffisant. Seulement si l'on veut modifier la variable elle-même on passe un pointeur.

    En plus, la conversion explicite entre void* et d'autres types pointeur est redondante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabintok= calloc(10, sizeof(int));
    fonctionne très bien.

  3. #3
    Pgs
    Pgs est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Par défaut
    Bonjour et merci pour cette réponse claire et rapide.
    Pour être certain d'avoir bien compris, peux-tu me confirmer que ne fonctionne pas car, au lieu de prendre l'adresse de tabintok[indice] pour l'indirection, il prend sa valeur ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Déjà faire un typedef qui cache un pointeur c'est 1 mauvaise pratique

    Pour preuve , lorsque tu parles de &tabintok, tu manipules un pointeur de pointeur ... qui n'est utile que si tu veux le créer (l'allouer, notamment avec calloc effectivement)
    L'autre technique pour éviter de passer un pointeur de pointeur en paramètre, c'est de retourner l’adresse pointeur fraîchement créé avec malloc (ou petits frères)

    De plus, avec un pointeur la syntaxe [] n'est pas recommandé. Effectivement, le nom d'1 variable tableau est 1 pointeur sur la première case, mais il faut utiliser l'arithmétique des pointeurs

    • tabintok[X] -> *(tabintok + X)
    • (*tabintok) -> tabintok[0]
    • *(tabintok[indice]) -> *(*(tabintok + indice)), donc si à la case indice tu n'as pas un pointeur valide tu plantes


    Et comme l'a rappelé @Corluk, tu as la précédence des opérateurs

  5. #5
    Pgs
    Pgs est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Par défaut
    Merci !

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonsoir
    Citation Envoyé par Pgs Voir le message
    Citation Envoyé par foetus Voir le message
    Déjà faire un typedef qui cache un pointeur c'est 1 mauvaise pratique
    Et en plus, le terme "TabInt" semble indiquer que tu assimiles un pointeur à un tableau (tableau de int ?) ce qui n'est pas du tout vrai.
    Certes la mémoire est composée de cases. Certes si tu pointes à un endroit de la mémoire tu peux alors te ballader à droite et à gauche de cet endroit comme quand tu te ballades dans un tableau. Certes la syntaxe "crochets" fonctionne pour un pointeur tout comme pour un tableau (en tableau 1D tout du moins). Certes quand tu passes un tableau à une fonction celle-ci ne récupère qu'une adresse qu'elle stockera dans un pointeur.

    Mais malgré toutes ces ressemblances, un pointeur ce n'est pas un tableau et si tu continues à les confondre, tu te planteras à plus ou moins long terme (notemment quand tu commenceras à travailler avec des tableaux en plusieurs dimensions)...

    Donc déjà rappelle-toi que ce n'est pas la même chose, et surtout comme dit foetus, ne cache pas les pointeurs car là aussi c'est un coup à se planter grave. Force-toi à les manipuler, à les comprendre, à les voir et petit à petit l'étoile ne te posera plus de souci.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Pgs
    Pgs est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Par défaut
    Salut,
    Merci pour tes conseils.
    Je reconnais que je ne vois pas assez la différence entre les deux.
    Il me semblait que mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef int* TabInt;
    TabInt tabintok;
    tabintok= (TabInt)calloc(10, sizeof(int));
    était une approche "pointeur" :
    - le processeur m'alloue une plage de mémoire et me donne l'adresse pour y accéder,
    - le type de mon pointeur détermine, à l'intérieur de cette plage, l'adresse des différents élements de même type qui y seront stockés.
    Est-ce bien une gestion " par pointeur" ?
    Et si oui, quelle est vraiment la différence avec un tableau ? Car mis à part le fait que j'ai réalisé manuellement les opérations, c'est pour moi comme si j'avais déclaré un tableau...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mise en forme tableau word avec VB6
    Par alexxx69 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 03/04/2007, 12h50
  2. [Tableaux] Renverser un tableau indicé
    Par ciel65 dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2006, 10h24
  3. [2.0][C#] Comment créer un tableau indicé
    Par LE NEINDRE dans le forum C#
    Réponses: 3
    Dernier message: 13/11/2006, 16h38
  4. [Tableaux] Tableau à indices non continus
    Par TNorth dans le forum Langage
    Réponses: 9
    Dernier message: 03/05/2006, 15h18
  5. [C#] Form ShowDialog pas comprendre :p
    Par betaphp dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/12/2005, 14h37

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