Salut
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 !
"Pourquoi avoir invente les tableaux si les pointeurs font la même chose ?" 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
https://openclassrooms.com/courses/la-verite-sur-les-tableaux-et-pointeurs-en-c
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.
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é.
Sinon au cas où, y a une erreur dans le 2e pastebin, c’est tab++; et non pas *tab++; pour avancer dans le tableau