CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : [C] J'ai une question

DébutPage précedente
1
Page suivantePage suivante
MrPasRobotDuTou MrPasRobotDuTou
MP
Niveau 3
23 octobre 2017 à 22:53:13

Salut :hap:

Je suis encore pas bien doué avec les notions de tableaux et pointeurs, et j'arrive pas a comprendre quelle est la différence entre ces deux codes.

https://pastebin.com/xvKBnkzY
et
https://pastebin.com/i66fQWKS

Niveau gestion de mémoire etc, quel est la différence...?
Pourquoi avoir invente les tableaux si les pointeurs font la même chose ? :(

Merci d'avance !

Message édité le 23 octobre 2017 à 22:53:26 par MrPasRobotDuTou
whiteapplex whiteapplex
MP
Niveau 10
23 octobre 2017 à 23:26:19

"Pourquoi avoir invente les tableaux si les pointeurs font la même chose ?" :d) Pour des questions de facilité d'écriture j'imagine
Mais en C, un tableau est un pointeur...donc ils ont pas inventé les tableaux à la place des pointeurs, ils ont juste mis des écritures plus simples.
En gros le tableau tab est un pointeur vers le premier élément de ce tableau. Je crois que tu peux le voir en demandant à ton ordi l'adresse de la case mémoire de "tab" et de "tab[0]"
Bref, faut juste retenir: tableau = pointeur

Voilà et si tu veux voir davantage des détails qui contrediront précisément chaque point de ce que je viens de dire, tu as ceci :ok:
https://openclassrooms.com/courses/la-verite-sur-les-tableaux-et-pointeurs-en-c

Message édité le 23 octobre 2017 à 23:26:33 par whiteapplex
Azmurael Azmurael
MP
Niveau 10
23 octobre 2017 à 23:57:01

On touche là une question subtile du C, et ma réponse méritera probablement d'être étoffée, mais allons y :

Les tableaux sont en C l'unique manière de garantir qu'une collection de variables sera stocké dans un espace contigu en mémoire.
Il faut rappeler que l'opérateur d'indexation de tableau en C ("[]") est un sucre syntaxique qui masque un déréférencement de pointeur ainsi que de l’arithmétique sur pointeur.

Pour illustrer, les lignes 1 et 2 suivantes sont identiques :

int int_array[10];
int *p = array;

int_array[7] = 1; // #1
*(p+7) = 1;       // #2

Ces lignes équivalentes sont un sucre syntaxique sur ce que le compilateur fait réellement, c'est à dire :

*((int *)(((char *) p) + (7 * sizeof(int)))) = 1; // #3

Ceci s'obscurcit encore car le nom d'un tableau peut être converti en l'adresse du pointeur du premier élément. L'expression suivante renvoie donc vrai :

int_array == &(int_array[0])

De là, on peut aboutir au fait qu'un pointeur peut être traitée comme étant la première case d'un tableau. Et c'est pour ça que l'on entretient la confusion que pointeur == tableau.

Yenshu Yenshu
MP
Niveau 8
24 octobre 2017 à 00:04:23

Le 23 octobre 2017 à 23:57:01 Azmurael a écrit :
On touche là une question subtile du C, et ma réponse méritera probablement d'être étoffée, mais allons y :

Les tableaux sont en C l'unique manière de garantir qu'une collection de variables sera stocké dans un espace contigu en mémoire.
Il faut rappeler que l'opérateur d'indexation de tableau en C ("[]") est un sucre syntaxique qui masque un déréférencement de pointeur ainsi que de l’arithmétique sur pointeur.

Pour illustrer, les lignes 1 et 2 suivantes sont identiques :

int int_array[10];
int *p = array;

int_array[7] = 1; // #1
*(p+7) = 1;       // #2

Ces lignes équivalentes sont un sucre syntaxique sur ce que le compilateur fait réellement, c'est à dire :

*((int *)(((char *) p) + (7 * sizeof(int)))) = 1; // #3

Ceci s'obscurcit encore car le nom d'un tableau peut être converti en l'adresse du pointeur du premier élément. L'expression suivante renvoie donc vrai :

int_array == &(int_array[0])

De là, on peut aboutir au fait qu'un pointeur peut être traitée comme étant la première case d'un tableau. Et c'est pour ça que l'on entretient la confusion que pointeur == tableau.

+1 Bien éxpliqué.

Yllid Yllid
MP
Niveau 16
24 octobre 2017 à 00:25:26

Sinon au cas où, y a une erreur dans le 2e pastebin, c’est tab++; et non pas *tab++; pour avancer dans le tableau :ok:

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment