• STATISTIQUES
  • Il y a eu un total de 2 membres et 3952 visiteurs sur le site dans les dernières 24h pour un total de 3 954 personnes!


    Membres: 2 604
    Discussions: 3 579
    Messages: 32 816
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Forum-Webmaster
    Une communauté webmaster pour apporter / recevoir de l'aide en création de site internet. Webmaster...
    Webmaster
    [EN] Rankk
    Site de challenge construit sur le principe d'une pyramide à 9 level. Level 1: 60,Level 2: 72,Level 3: 68,Lev...
    Challenges
    [FR] Hackfest
    Le Hackfest est un évènement de sécurité et de piratage informatique au Québec reg...
    Hacking
    [EN] Hack this site
    Basic: 11, Realistic: 17, Application: 18, Programming: 12, Extbasic: 14, Javascript: 7, Stego: 17
    Challenges
    [EN] Defcon
    Lancé en 1992 par Dark Tangent, DEFCON est la plus ancienne et la plus grande conférence underground de...
    Hacking
    [FR] Zenk-Security
    La communauté zenk-security a pour objet principal la sécurité informatique, nous sommes des tou...
    Hacking
    [EN] Sabre Films
    Site de challenge présenté sous la forme d'une quête. Vous êtes un détective et devrez résoudre d...
    Challenges

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C TOTW 2] Parcours de tableau
01-09-2014, 10h42 (Modification du message : 15-09-2014, 13h44 par ark.)
Message : #1
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
[C TOTW 2] Parcours de tableau
Hello all,

nouveau tip of the week, aujourd'hui, je vous propose un petit truc pratique avec les pointeurs.

imaginons un tableau de données, comme suit :

Code C :

int arr[] = {7, 4, 6, 8, 6, 5, 2, 0, 6, 7, 6, 1, 6, 0xd, 6, 5};
 


si on veut parcourir tous les éléments de ce tableau, on va pouvoir utiliser la très classique méthode a coup de sizeof :

Code C :

for (i = 0 ; i < (sizeof(arr) / sizeof(arr[0])) ; ++i) {
    printf("%d", arr[i]);
}
 


Mais si on réfléchit un peu, arr est un tableau, on connait donc son adresse. Ce qu'il faut savoir avec les tableaux, c'est que leur taille est celle totale des tailles des éléments. c'est pourquoi on peut faire le truc avec le sizeof. Mais du coup, &arr + 1, pointe vers la fin du tableau !

Ce qui veut dire que (&arr + 1) - &arr == sizeof(arr) !! Et c'est assez pratique parce que pour le coup, on va pouvoir utiliser directement un pointeur du bon type pour parcourir notre tableau aisément !

Code C :

int *p;

for (p = arr; p < *(&arr + 1) ; ++p) {
    printf("%d", *p);
}
 


A noter aussi que *(&arr + 1) peut s'ecrire aussi: (&arg)[1] mais aussi encore 1[&arg]

Ce qui au final peut donner :
Code C :

for (p = arr; p < 1[&arr] ; ++p) {
    printf("%d", *p);
}
 
+1 (9) -1 (0) Répondre
22-09-2014, 13h54 (Modification du message : 22-09-2014, 14h00 par crown.)
Message : #2
crown Hors ligne
Membre actif
*



Messages : 52
Sujets : 5
Points: 18
Inscription : Oct 2011
RE: [C TOTW 2] Parcours de tableau
Juste pour être sûr d'avoir bien compris (je garde la même structure que ton tableau), on prend le cas où &arr = 0x0028FECC, (&arr + 1) = 0x0028FF0C car en mémoire 64 octets sont réservés, la mémoire étant donc déjà utilisée dans cette espace, on chope l'adresse la 1ere adresse mémoire de libre après celle occupé par le tableau ?

Du coup la condition de ta boucle for peut s'écrire de la façon suivante :

Code C :

int arr[] = {7, 4, 6, 8, 6, 5, 2, 0, 6, 7, 6, 1, 6, 0xd, 6, 5};

    int * ptr;

    for (ptr = arr; ptr < (&arr + 1) ; ptr ++) {
        printf("val : %d at %p\n", *ptr, ptr);
    }
 
+1 (0) -1 (0) Répondre
22-09-2014, 13h57
Message : #3
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
RE: [C TOTW 2] Parcours de tableau
Oui, c'est bien ça =)
+1 (0) -1 (0) Répondre
29-09-2014, 12h46 (Modification du message : 29-09-2014, 13h04 par crown.)
Message : #4
crown Hors ligne
Membre actif
*



Messages : 52
Sujets : 5
Points: 18
Inscription : Oct 2011
RE: [C TOTW 2] Parcours de tableau
Du coup j'ai une autre question, en faisant &arr[1] on chope l'adresse du deuxième élément du tableau, mais en quoi est-ce différent de (&arr)[1] ?

[EDIT] : Du coup j'ai trouvé, pour ceux que ça intéresserait : http://arjunsreedharan.org/post/69303442...-find-size

[EDIT#2] : Bon apparemment les pointeurs et moi c'est pas trop ça :

Code C :

#include <stdio.h>

void listTbl(int *tab)
{
    int* ptr;

    for(ptr = tab ; ptr < (&tab)[1]; ptr++)
    {
        printf("%d\n", *ptr);
    }
}

int main(void)
{
    int tbl[] = {1, 15 ,12 ,20 ,352 ,15};

    listTbl(tbl);

    return 0;
}
 


Ici ça ne me liste pas mon tableau et je vois pas pourquoi, si vous avez une idée è_é ?

[EDIT#3] : Finalement j'ai testé 2/3 trucs et le code ci dessous marche en revanche je sais pas pourquoi :/

Code C :

#include <stdio.h>

void listTbl(int *tab)
{
    int* ptr;

    for(ptr = tab ; ptr < (&tab + 12); ptr++)
    {
        printf("%d at 0x%p\n", *ptr,ptr);
    }
}

int main(void)
{
    int tbl[6] = {1, 15 ,12 ,20 ,352 ,15};

    listTbl(tbl);

    return 0;
}
 
+1 (1) -1 (0) Répondre
29-09-2014, 12h47 (Modification du message : 29-09-2014, 13h09 par EpicOut.)
Message : #5
EpicOut Hors ligne
Banni



Messages : 121
Sujets : 10
Points: 22
Inscription : Feb 2012
RE: [C TOTW 2] Parcours de tableau
il vient d'où ton "(&arr)[1]" ? ce serait plutôt (&tab)[1]

Ca donnerait plus un truc comme ça:

Code C :
#include <stdio.h>

void listTbl(int *tab, int len)
{
    int* ptr;

    for(ptr = tab ; ptr <= (&tab[len -1]); ++ptr)
    {
        printf("%d\n", *ptr);
    }
}

int main(void)
{
    int tbl[] = {1, 15 ,12 ,20 ,352 ,15};

    listTbl(tbl,6);

    return 0;
}

 
+1 (0) -1 (0) Répondre
29-09-2014, 17h44 (Modification du message : 29-09-2014, 17h44 par crown.)
Message : #6
crown Hors ligne
Membre actif
*



Messages : 52
Sujets : 5
Points: 18
Inscription : Oct 2011
RE: [C TOTW 2] Parcours de tableau
Autant pour moi le (&arr)[1] c'est une erreur d’inattention dans le code que je compile je mets bien &tab mais ça me donne le même résultat (càd rien).

Du coup oui (&tab[5]) marche mieux en effet, bon en l'occurence c'est (&tab[6]) pour afficher toutes les valeurs.

Par contre (&tab[6]) == (tab + 6) (ici je vois bien pourquoi c'est deux expressions ce valent) mais pour (&tab + 12) je vois pas en quoi cette expression est interprétée comme les deux précédentes.

[EDIT] : Je pense avoir un début d'explication pour (&tab + 12) qui correspond à (&tab[6]), dîtes moi si je me trompe : on prend &tab = 0028FEE0 et (&tab + 12) = 0028FF10, on a donc 0x0028FF10 - 0x0028FEE0 = 0x30 soit 48 en décimal, en sachant que sizeof(*ptr) = 4, on a 48 / 4 = 12, ici on retrouve le 12 mais à partir de là je vois toujours pas pourquoi ça correspond. Ce qui est assez déroutant c'est que tab devrait être égal à &tab en ce qui concerne l'adresse, helas non dans la fonction, tab = 0028FEF8 et &tab = 0028FEE0 soit 24(d) de moins (ce qui correspondrait au tableau de 6 int ?, un int étant de 4 octets). Si vous avez des suggestions pour expliquer ça ? ; je suis preneur.
+1 (0) -1 (0) Répondre


Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  [C TOTW 6] Xor tricks ark 7 230 06-03-2016, 23h36
Dernier message: Commodor
  [C] Initialiser un tableau notfound 2 77 28-08-2015, 11h01
Dernier message: eax64
  [C TOTW 5] bitfields ! ark 4 130 23-09-2014, 11h17
Dernier message: Aniem
  [C TOTW 4] Equivalent de try / catch / throw en C ark 0 93 15-09-2014, 10h00
Dernier message: ark
  [C TOTW 3] #warning, #error ark 1 119 10-09-2014, 11h49
Dernier message: ark
  [C TOTW 1] Trick avec #include ark 10 246 01-09-2014, 18h23
Dernier message: Commodor
  [C] Parcours récursif des dossiers InstinctHack 12 190 22-04-2013, 11h20
Dernier message: sakiir
  [C] question tableau InFamouZz 8 193 20-03-2013, 19h19
Dernier message: sakiir
  [C++] Parcours de dossier récursif Dobry 2 67 04-03-2012, 11h13
Dernier message: Dobry

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut